@jvsoft/components 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/build.js +20 -0
- package/dialog-flotante/dialog-flotante.component.html +66 -0
- package/dialog-flotante/dialog-flotante.component.ts +115 -0
- package/dialog-flotante/dialog-flotante.interface.ts +13 -0
- package/dialog-flotante/index.ts +1 -0
- package/dialog-flotante/ng-package.json +5 -0
- package/{index.d.ts → index.ts} +8 -1
- package/lista-arbol/lista-arbol.component.html +66 -0
- package/lista-arbol/lista-arbol.component.ts +238 -0
- package/lista-arbol/lista-arbol.functions.ts +46 -0
- package/lista-arbol/ng-package.json +5 -0
- package/luces-navidad/christmas-tree.png +0 -0
- package/luces-navidad/index.ts +1 -0
- package/luces-navidad/luces-navidad.component.html +6 -0
- package/luces-navidad/luces-navidad.component.ts +24 -0
- package/luces-navidad/ng-package.json +5 -0
- package/mat-suffix-search-button/index.ts +1 -0
- package/mat-suffix-search-button/mat-suffix-search-button.component.html +5 -0
- package/mat-suffix-search-button/mat-suffix-search-button.component.ts +36 -0
- package/mat-suffix-search-button/ng-package.json +5 -0
- package/menu/index.ts +1 -0
- package/menu/menu.component.html +40 -0
- package/menu/menu.component.ts +88 -0
- package/menu/menu.interface.ts +16 -0
- package/menu/ng-package.json +5 -0
- package/ng-package.json +17 -0
- package/package.json +17 -42
- package/progress-spinner.zip +0 -0
- package/tabla-mantenimiento/classes/data-model.ts +150 -0
- package/tabla-mantenimiento/components/progress-bar/index.ts +1 -0
- package/tabla-mantenimiento/components/progress-bar/ng-package.json +5 -0
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.html +10 -0
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.ts +85 -0
- package/tabla-mantenimiento/components/progress-bar/public-api.ts +2 -0
- package/tabla-mantenimiento/index.ts +1 -0
- package/tabla-mantenimiento/interfaces/{archivo.d.ts → archivo.ts} +7 -4
- package/tabla-mantenimiento/interfaces/global/{boton-mantenimiento.d.ts → boton-mantenimiento.ts} +9 -3
- package/tabla-mantenimiento/interfaces/global/{columnas-tabla.d.ts → columnas-tabla.ts} +90 -13
- package/tabla-mantenimiento/interfaces/global/export-excel-servidor.ts +0 -0
- package/tabla-mantenimiento/interfaces/global/no-export.ts +11 -0
- package/tabla-mantenimiento/interfaces/global/{otros.d.ts → otros.ts} +15 -3
- package/tabla-mantenimiento/interfaces/implements/{incluye-tabla-mantenimiento.d.ts → incluye-tabla-mantenimiento.ts} +6 -4
- package/tabla-mantenimiento/interfaces/implements/{index.d.ts → index.ts} +1 -0
- package/tabla-mantenimiento/mat-row-keyboard-selection.directive.ts +97 -0
- package/tabla-mantenimiento/ng-package.json +5 -0
- package/tabla-mantenimiento/pipes/no-sanitize.pipe.ts +12 -0
- package/tabla-mantenimiento/pipes/zero-fill.pipe.ts +19 -0
- package/tabla-mantenimiento/{public-api.d.ts → public-api.ts} +3 -2
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.html +22 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.ts +12 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.html +58 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.ts +19 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.html +40 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.ts +17 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.html +25 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.ts +14 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.html +28 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.ts +13 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.html +30 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.ts +38 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.html +97 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.ts +43 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.html +26 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.ts +36 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.ts +54 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.html +76 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.ts +67 -0
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.html +7 -0
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.ts +39 -0
- package/tabla-mantenimiento/tabla-mantenimiento.component.html +385 -0
- package/tabla-mantenimiento/tabla-mantenimiento.component.ts +951 -0
- package/tabla-mantenimiento/tabla-mantenimiento.functions.ts +57 -0
- package/tabla-mantenimiento/tabla-mantenimiento.service.ts +44 -0
- package/tabla-mantenimiento/table-util.ts +49 -0
- package/tabla-mantenimiento.zip +0 -0
- package/tsconfig.lib.json +16 -0
- package/tsconfig.lib.prod.json +11 -0
- package/tsconfig.spec.json +15 -0
- package/yarn-error.log +68 -0
- package/dialog-flotante/dialog-flotante.component.d.ts +0 -32
- package/dialog-flotante/dialog-flotante.interface.d.ts +0 -11
- package/dialog-flotante/index.d.ts +0 -5
- package/fesm2022/jvsoft-components-dialog-flotante.mjs +0 -130
- package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +0 -1
- package/fesm2022/jvsoft-components-lista-arbol.mjs +0 -266
- package/fesm2022/jvsoft-components-lista-arbol.mjs.map +0 -1
- package/fesm2022/jvsoft-components-luces-navidad.mjs +0 -33
- package/fesm2022/jvsoft-components-luces-navidad.mjs.map +0 -1
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +0 -47
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +0 -1
- package/fesm2022/jvsoft-components-menu.mjs +0 -102
- package/fesm2022/jvsoft-components-menu.mjs.map +0 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +0 -91
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +0 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +0 -1801
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +0 -1
- package/fesm2022/jvsoft-components.mjs +0 -2309
- package/fesm2022/jvsoft-components.mjs.map +0 -1
- package/lista-arbol/index.d.ts +0 -5
- package/lista-arbol/lista-arbol.component.d.ts +0 -58
- package/lista-arbol/lista-arbol.functions.d.ts +0 -1
- package/luces-navidad/index.d.ts +0 -5
- package/luces-navidad/luces-navidad.component.d.ts +0 -11
- package/mat-suffix-search-button/index.d.ts +0 -5
- package/mat-suffix-search-button/mat-suffix-search-button.component.d.ts +0 -12
- package/menu/index.d.ts +0 -5
- package/menu/menu.component.d.ts +0 -25
- package/menu/menu.interface.d.ts +0 -16
- package/src/styles/base-jvsoft-components.css +0 -9
- package/tabla-mantenimiento/classes/data-model.d.ts +0 -25
- package/tabla-mantenimiento/components/progress-bar/index.d.ts +0 -5
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.d.ts +0 -30
- package/tabla-mantenimiento/components/progress-bar/public-api.d.ts +0 -1
- package/tabla-mantenimiento/index.d.ts +0 -5
- package/tabla-mantenimiento/interfaces/global/no-export.d.ts +0 -2
- package/tabla-mantenimiento/mat-row-keyboard-selection.directive.d.ts +0 -19
- package/tabla-mantenimiento/pipes/no-sanitize.pipe.d.ts +0 -10
- package/tabla-mantenimiento/pipes/zero-fill.pipe.d.ts +0 -8
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.d.ts +0 -8
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.d.ts +0 -9
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.d.ts +0 -9
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.d.ts +0 -8
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.d.ts +0 -8
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.d.ts +0 -9
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.d.ts +0 -8
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.d.ts +0 -18
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts +0 -23
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.d.ts +0 -21
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.d.ts +0 -18
- package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +0 -147
- package/tabla-mantenimiento/tabla-mantenimiento.functions.d.ts +0 -5
- package/tabla-mantenimiento/tabla-mantenimiento.service.d.ts +0 -8
- package/tabla-mantenimiento/table-util.d.ts +0 -11
- /package/dialog-flotante/{public-api.d.ts → public-api.ts} +0 -0
- /package/lista-arbol/{public-api.d.ts → public-api.ts} +0 -0
- /package/luces-navidad/{public-api.d.ts → public-api.ts} +0 -0
- /package/mat-suffix-search-button/{public-api.d.ts → public-api.ts} +0 -0
- /package/menu/{public-api.d.ts → public-api.ts} +0 -0
- /package/tabla-mantenimiento/interfaces/global/{index.d.ts → index.ts} +0 -0
- /package/tabla-mantenimiento/interfaces/{index.d.ts → index.ts} +0 -0
|
@@ -1,2309 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Output, Input, Component, HostListener, Directive, ViewChild, Optional, inject, Pipe, NgModule, ContentChildren, ViewChildren, Injectable, ElementRef, HostBinding } from '@angular/core';
|
|
3
|
-
import * as i3 from '@angular/material/dialog';
|
|
4
|
-
import { MatDialogModule } from '@angular/material/dialog';
|
|
5
|
-
import * as i4 from '@angular/material/icon';
|
|
6
|
-
import { MatIconModule, MatIconRegistry, MatIcon } from '@angular/material/icon';
|
|
7
|
-
import * as i1 from '@angular/common';
|
|
8
|
-
import { CommonModule, DecimalPipe, NgIf, NgForOf } from '@angular/common';
|
|
9
|
-
import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
|
|
10
|
-
import * as i5 from '@angular/material/core';
|
|
11
|
-
import { MatRipple, MatRippleModule } from '@angular/material/core';
|
|
12
|
-
import * as i6 from '@angular/material/divider';
|
|
13
|
-
import { MatDivider, MatDividerModule } from '@angular/material/divider';
|
|
14
|
-
import { __decorate } from 'tslib';
|
|
15
|
-
import { trigger, state, transition, style, animate } from '@angular/animations';
|
|
16
|
-
import { TemplatePortal } from '@angular/cdk/portal';
|
|
17
|
-
import * as i1$2 from '@angular/forms';
|
|
18
|
-
import { Validators, FormControl, FormGroup, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
19
|
-
import * as i14 from '@angular/material/badge';
|
|
20
|
-
import { MatBadgeModule } from '@angular/material/badge';
|
|
21
|
-
import * as i5$1 from '@angular/material/checkbox';
|
|
22
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
23
|
-
import * as i2$1 from '@angular/material/menu';
|
|
24
|
-
import { MatMenuModule, MatMenu } from '@angular/material/menu';
|
|
25
|
-
import * as i9 from '@angular/material/paginator';
|
|
26
|
-
import { MatPaginatorModule, MatPaginator, MAT_PAGINATOR_DEFAULT_OPTIONS } from '@angular/material/paginator';
|
|
27
|
-
import * as i3$1 from '@angular/material/sort';
|
|
28
|
-
import { MatSortModule, MatSort } from '@angular/material/sort';
|
|
29
|
-
import * as i2 from '@angular/material/table';
|
|
30
|
-
import { MatColumnDef, MatTable, MatTableModule, MatTableDataSource, MatFooterRow, MatRow } from '@angular/material/table';
|
|
31
|
-
import * as i4$1 from '@angular/material/tooltip';
|
|
32
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
33
|
-
import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
|
|
34
|
-
import moment from 'moment';
|
|
35
|
-
import { Subject, takeUntil, of, fromEvent } from 'rxjs';
|
|
36
|
-
import { map, filter, take } from 'rxjs/operators';
|
|
37
|
-
import shortHash from 'shorthash2';
|
|
38
|
-
import * as i1$1 from '@angular/platform-browser';
|
|
39
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
40
|
-
import * as XLSX from 'xlsx';
|
|
41
|
-
import * as i2$2 from '@angular/cdk/overlay';
|
|
42
|
-
import * as i3$2 from '@angular/material/tree';
|
|
43
|
-
import { MatTreeModule } from '@angular/material/tree';
|
|
44
|
-
import { NestedTreeControl } from '@angular/cdk/tree';
|
|
45
|
-
import { DataModel as DataModel$1 } from '@jvsoft/utils';
|
|
46
|
-
|
|
47
|
-
class DialogFlotanteComponent {
|
|
48
|
-
cssClases = {};
|
|
49
|
-
_sinTitulo = false;
|
|
50
|
-
get sinTitulo() {
|
|
51
|
-
return !!this._sinTitulo;
|
|
52
|
-
}
|
|
53
|
-
set sinTitulo(val) {
|
|
54
|
-
this._sinTitulo = val == '';
|
|
55
|
-
}
|
|
56
|
-
_sinBarraDeAccion = false;
|
|
57
|
-
get sinBarraDeAccion() {
|
|
58
|
-
return !!this._sinBarraDeAccion;
|
|
59
|
-
}
|
|
60
|
-
set sinBarraDeAccion(val) {
|
|
61
|
-
this._sinBarraDeAccion = val == '';
|
|
62
|
-
}
|
|
63
|
-
defaultBtnCerrar = { label: 'CERRAR', class: 'text-gray-700 border-gray-700' };
|
|
64
|
-
_btnCerrar = this.defaultBtnCerrar;
|
|
65
|
-
get btnCerrar() {
|
|
66
|
-
return this._btnCerrar;
|
|
67
|
-
}
|
|
68
|
-
set btnCerrar(val) {
|
|
69
|
-
if (val == null || val === '') {
|
|
70
|
-
this._btnCerrar = this.defaultBtnCerrar;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
this._btnCerrar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnCerrar, label: val } :
|
|
74
|
-
(typeof val === 'boolean' && val) ? this.defaultBtnCerrar :
|
|
75
|
-
val ?? this.defaultBtnCerrar;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
_btnCerrarBarra = true;
|
|
79
|
-
get btnCerrarBarra() {
|
|
80
|
-
return this._btnCerrarBarra;
|
|
81
|
-
}
|
|
82
|
-
set btnCerrarBarra(val) {
|
|
83
|
-
this._btnCerrarBarra = val || true;
|
|
84
|
-
}
|
|
85
|
-
defaultBtnGuardar = {
|
|
86
|
-
label: 'GUARDAR', class: 'text-blue-700 border-blue-700', icono: 'roundSave'
|
|
87
|
-
};
|
|
88
|
-
_btnGuardar = this.defaultBtnGuardar;
|
|
89
|
-
get btnGuardar() {
|
|
90
|
-
return this._btnGuardar;
|
|
91
|
-
}
|
|
92
|
-
set btnGuardar(val) {
|
|
93
|
-
console.log(val);
|
|
94
|
-
if (val == null || val === '') {
|
|
95
|
-
this._btnGuardar = this.defaultBtnGuardar;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this._btnGuardar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnGuardar, label: val } :
|
|
99
|
-
(typeof val === 'boolean' && val) ? this.defaultBtnGuardar :
|
|
100
|
-
val ?? this.defaultBtnGuardar;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
iconoTitulo;
|
|
104
|
-
matDialogRefActual;
|
|
105
|
-
btnGuardarClick = new EventEmitter();
|
|
106
|
-
btnCerrarClick = new EventEmitter();
|
|
107
|
-
guardarDialogo() {
|
|
108
|
-
this.btnGuardarClick.emit(true);
|
|
109
|
-
}
|
|
110
|
-
cerrarDialogo() {
|
|
111
|
-
this.btnCerrarClick.emit(true);
|
|
112
|
-
if (this.matDialogRefActual) {
|
|
113
|
-
if (this.matDialogRefActual.componentInstance?.validarCerrarDialog) {
|
|
114
|
-
this.matDialogRefActual.componentInstance?.validarCerrarDialog();
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this.matDialogRefActual.close('Cerrado GDLG');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: DialogFlotanteComponent, isStandalone: true, selector: "[jvsDialogFlotante]", inputs: { cssClases: "cssClases", sinTitulo: "sinTitulo", sinBarraDeAccion: "sinBarraDeAccion", btnCerrar: "btnCerrar", btnCerrarBarra: "btnCerrarBarra", btnGuardar: "btnGuardar", iconoTitulo: "iconoTitulo", matDialogRefActual: "matDialogRefActual" }, outputs: { btnGuardarClick: "btnGuardarClick", btnCerrarClick: "btnCerrarClick" }, host: { classAttribute: "jvs-dialog-flotante" }, ngImport: i0, template: "<ng-container *ngIf=\"sinTitulo; else conTitulo\">\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n</ng-container>\n\n<ng-template #conTitulo>\n <div cdkDrag class=\"block h-full\" cdkDragRootElement=\".cdk-overlay-pane\" cdkDragBoundary=\"body\">\n <div class=\"flex-auto flex items-center justify-between hover:cursor-move gap-1\"\n [ngClass]=\"cssClases['titulo'] ?? 'bg-primary text-primary-contrast'\"\n mat-dialog-title cdkDragHandle>\n\n <mat-icon *ngIf=\"iconoTitulo\" class=\"flex-none icon-xs\" [svgIcon]=\"iconoTitulo\"></mat-icon>\n <ng-content select=\"[tituloImagen]\"></ng-content>\n <h5 class=\"flex-1 m-0\">\n <ng-content select=\"[titulo]\"></ng-content>\n </h5>\n <ng-content select=\"[selectTitulo]\"></ng-content>\n\n <ng-container *ngIf=\"btnCerrar || btnCerrarBarra\">\n <button matRipple class=\"flex items-center justify-center ml-2 h-6 w-6 bg-red-700 rounded-md text-white\"\n type=\"button\" [mat-dialog-close]=\"!matDialogRefActual\"\n (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon svgIcon=\"roundClose\"></mat-icon>\n </button>\n </ng-container>\n </div>\n\n <mat-divider class=\"flex-auto bg-primary\"></mat-divider>\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #parteComun>\n <mat-dialog-content class=\"flex-1\">\n <div class=\"contenedor-cuerpo\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"flex-auto flex items-center justify-between gap-1 pt-0 mt-0\" *ngIf=\"!sinBarraDeAccion\">\n <div class=\"flex items-start justify-start gap-1\">\n <ng-content select=\"[pieIzquierda]\"></ng-content>\n </div>\n <div class=\"flex items-center justify-center gap-1\">\n <ng-content select=\"[pieCentro]\"></ng-content>\n </div>\n <div class=\"flex items-end justify-end gap-1\">\n <ng-content select=\"[pieDerecha]\"></ng-content>\n\n <!-- Bot\u00F3n Guardar -->\n <button matRipple *ngIf=\"btnGuardar\" type=\"submit\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnGuardar.class\"\n [class]=\"cssClases['btnGuardar']\" (click)=\"guardarDialogo()\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"btnGuardar?.icono ?? ''\"></mat-icon>\n <span>{{ btnGuardar.label }}</span>\n </button>\n\n <!-- Bot\u00F3n Cerrar -->\n <button matRipple *ngIf=\"btnCerrar\" type=\"button\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnCerrar.class\"\n [mat-dialog-close]=\"!matDialogRefActual\" (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon class=\"icon-xs\" svgIcon=\"roundClose\"></mat-icon>\n <span>{{ btnCerrar.label }}</span>\n </button>\n </div>\n </mat-dialog-actions>\n</ng-template>\n", styles: [".jvs-dialog-flotante{max-width:98vw}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-checkbox__native-control:enabled:focus:focus:not(:checked):not(:indeterminate)~.mdc-checkbox__background{border-color:var(--color-prnpx tailwindcss init --fullimary-contrast)!important}.jvs-dialog-flotante fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}.jvs-dialog-flotante fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }] });
|
|
123
|
-
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, decorators: [{
|
|
125
|
-
type: Component,
|
|
126
|
-
args: [{ selector: '[jvsDialogFlotante]', imports: [
|
|
127
|
-
CommonModule,
|
|
128
|
-
MatIconModule,
|
|
129
|
-
MatDialogModule,
|
|
130
|
-
CdkDrag,
|
|
131
|
-
CdkDragHandle,
|
|
132
|
-
MatRipple,
|
|
133
|
-
MatDivider,
|
|
134
|
-
], host: {
|
|
135
|
-
class: 'jvs-dialog-flotante',
|
|
136
|
-
}, template: "<ng-container *ngIf=\"sinTitulo; else conTitulo\">\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n</ng-container>\n\n<ng-template #conTitulo>\n <div cdkDrag class=\"block h-full\" cdkDragRootElement=\".cdk-overlay-pane\" cdkDragBoundary=\"body\">\n <div class=\"flex-auto flex items-center justify-between hover:cursor-move gap-1\"\n [ngClass]=\"cssClases['titulo'] ?? 'bg-primary text-primary-contrast'\"\n mat-dialog-title cdkDragHandle>\n\n <mat-icon *ngIf=\"iconoTitulo\" class=\"flex-none icon-xs\" [svgIcon]=\"iconoTitulo\"></mat-icon>\n <ng-content select=\"[tituloImagen]\"></ng-content>\n <h5 class=\"flex-1 m-0\">\n <ng-content select=\"[titulo]\"></ng-content>\n </h5>\n <ng-content select=\"[selectTitulo]\"></ng-content>\n\n <ng-container *ngIf=\"btnCerrar || btnCerrarBarra\">\n <button matRipple class=\"flex items-center justify-center ml-2 h-6 w-6 bg-red-700 rounded-md text-white\"\n type=\"button\" [mat-dialog-close]=\"!matDialogRefActual\"\n (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon svgIcon=\"roundClose\"></mat-icon>\n </button>\n </ng-container>\n </div>\n\n <mat-divider class=\"flex-auto bg-primary\"></mat-divider>\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #parteComun>\n <mat-dialog-content class=\"flex-1\">\n <div class=\"contenedor-cuerpo\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"flex-auto flex items-center justify-between gap-1 pt-0 mt-0\" *ngIf=\"!sinBarraDeAccion\">\n <div class=\"flex items-start justify-start gap-1\">\n <ng-content select=\"[pieIzquierda]\"></ng-content>\n </div>\n <div class=\"flex items-center justify-center gap-1\">\n <ng-content select=\"[pieCentro]\"></ng-content>\n </div>\n <div class=\"flex items-end justify-end gap-1\">\n <ng-content select=\"[pieDerecha]\"></ng-content>\n\n <!-- Bot\u00F3n Guardar -->\n <button matRipple *ngIf=\"btnGuardar\" type=\"submit\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnGuardar.class\"\n [class]=\"cssClases['btnGuardar']\" (click)=\"guardarDialogo()\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"btnGuardar?.icono ?? ''\"></mat-icon>\n <span>{{ btnGuardar.label }}</span>\n </button>\n\n <!-- Bot\u00F3n Cerrar -->\n <button matRipple *ngIf=\"btnCerrar\" type=\"button\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnCerrar.class\"\n [mat-dialog-close]=\"!matDialogRefActual\" (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon class=\"icon-xs\" svgIcon=\"roundClose\"></mat-icon>\n <span>{{ btnCerrar.label }}</span>\n </button>\n </div>\n </mat-dialog-actions>\n</ng-template>\n", styles: [".jvs-dialog-flotante{max-width:98vw}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-checkbox__native-control:enabled:focus:focus:not(:checked):not(:indeterminate)~.mdc-checkbox__background{border-color:var(--color-prnpx tailwindcss init --fullimary-contrast)!important}.jvs-dialog-flotante fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}.jvs-dialog-flotante fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}\n"] }]
|
|
137
|
-
}], propDecorators: { cssClases: [{
|
|
138
|
-
type: Input
|
|
139
|
-
}], sinTitulo: [{
|
|
140
|
-
type: Input
|
|
141
|
-
}], sinBarraDeAccion: [{
|
|
142
|
-
type: Input
|
|
143
|
-
}], btnCerrar: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], btnCerrarBarra: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], btnGuardar: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}], iconoTitulo: [{
|
|
150
|
-
type: Input
|
|
151
|
-
}], matDialogRefActual: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], btnGuardarClick: [{
|
|
154
|
-
type: Output
|
|
155
|
-
}], btnCerrarClick: [{
|
|
156
|
-
type: Output
|
|
157
|
-
}] } });
|
|
158
|
-
|
|
159
|
-
function buscarEnArray(coleccion, idBuscar, dato) {
|
|
160
|
-
if (!Array.isArray(coleccion) || coleccion.length === 0)
|
|
161
|
-
return null; // 🔹 Validación de entrada
|
|
162
|
-
return Array.isArray(idBuscar)
|
|
163
|
-
? coleccion.find(item => idBuscar.every((campo, idx) => item[campo] === dato[idx])) || null
|
|
164
|
-
: coleccion.find(item => item[idBuscar] === dato) || null;
|
|
165
|
-
}
|
|
166
|
-
function formatearFecha(val, hora = '00:00:00') {
|
|
167
|
-
if (val) {
|
|
168
|
-
if (val.length <= 10) {
|
|
169
|
-
val = val + ' ' + hora;
|
|
170
|
-
}
|
|
171
|
-
return new Date(val);
|
|
172
|
-
}
|
|
173
|
-
return val;
|
|
174
|
-
}
|
|
175
|
-
function esNumero(value) {
|
|
176
|
-
return !isNaN(Number(value));
|
|
177
|
-
}
|
|
178
|
-
function capitalizarTexto(texto) {
|
|
179
|
-
texto = texto.replace(/_/g, ' ');
|
|
180
|
-
texto = texto.replace(/-/g, ' ');
|
|
181
|
-
const textoCortado = texto.split(' ');
|
|
182
|
-
const nText = [];
|
|
183
|
-
textoCortado.forEach(textActual => {
|
|
184
|
-
nText.push(textActual.charAt(0).toUpperCase() + textActual.slice(1));
|
|
185
|
-
});
|
|
186
|
-
return nText.join(' ');
|
|
187
|
-
}
|
|
188
|
-
function getBrowserName() {
|
|
189
|
-
const agent = window.navigator.userAgent.toLowerCase();
|
|
190
|
-
switch (true) {
|
|
191
|
-
case agent.indexOf('edge') > -1:
|
|
192
|
-
return 'edge';
|
|
193
|
-
case agent.indexOf('opr') > -1 && !!window.opr:
|
|
194
|
-
return 'opera';
|
|
195
|
-
case agent.indexOf('chrome') > -1 && !!window.chrome:
|
|
196
|
-
return 'chrome';
|
|
197
|
-
case agent.indexOf('trident') > -1:
|
|
198
|
-
return 'ie';
|
|
199
|
-
case agent.indexOf('firefox') > -1:
|
|
200
|
-
return 'firefox';
|
|
201
|
-
case agent.indexOf('safari') > -1:
|
|
202
|
-
return 'safari';
|
|
203
|
-
default:
|
|
204
|
-
return 'other';
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
class DataModel {
|
|
209
|
-
modelosChk = {}; // Usar any para valores dinámicos
|
|
210
|
-
checkbox;
|
|
211
|
-
constructor() {
|
|
212
|
-
this.checkbox = new ForCheckboxModel(this);
|
|
213
|
-
}
|
|
214
|
-
generarId(row, campoValor, separador = '') {
|
|
215
|
-
if (typeof campoValor == 'string') {
|
|
216
|
-
campoValor = [campoValor];
|
|
217
|
-
}
|
|
218
|
-
return campoValor.map(data => row[data]).join(separador);
|
|
219
|
-
}
|
|
220
|
-
// Agrega controles al objeto modelosChk
|
|
221
|
-
agregarControles(lista, idLista, limpiar = true, campoValor = null, campoValorSeparador = '') {
|
|
222
|
-
if (limpiar) {
|
|
223
|
-
this.modelosChk = {};
|
|
224
|
-
}
|
|
225
|
-
const asignarValor = (dat, idLista, campoValor, key) => {
|
|
226
|
-
if (!key) {
|
|
227
|
-
key = dat[idLista] + (campoValor.includes('.') ? '' : `.${campoValor}`);
|
|
228
|
-
}
|
|
229
|
-
const mat = campoValor.match(/^([in])[A-Z][a-zA-Z]+/);
|
|
230
|
-
if (mat) {
|
|
231
|
-
this.modelosChk[key] = dat[campoValor] * 1;
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
this.modelosChk[key] = dat[campoValor];
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
lista.forEach(dat => {
|
|
238
|
-
if (campoValor === null) {
|
|
239
|
-
// Caso 1: Sin campoValor, se asigna false
|
|
240
|
-
this.modelosChk[dat[idLista]] = false;
|
|
241
|
-
}
|
|
242
|
-
else if (typeof campoValor === 'string') {
|
|
243
|
-
// Caso 2: campoValor es un string
|
|
244
|
-
asignarValor(dat, idLista, campoValor, dat[idLista]);
|
|
245
|
-
}
|
|
246
|
-
else if (campoValorSeparador) {
|
|
247
|
-
const idStr = this.generarId(dat, campoValor, campoValorSeparador);
|
|
248
|
-
// Caso 2: campoValor es un string
|
|
249
|
-
asignarValor(dat, idLista, '.', idStr);
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
// Caso 3: campoValor es un array de strings
|
|
253
|
-
campoValor.forEach(data => asignarValor(dat, idLista, data));
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
// Establece el estado de un índice
|
|
258
|
-
setState(idx, state) {
|
|
259
|
-
this.modelosChk[idx] = state;
|
|
260
|
-
}
|
|
261
|
-
// Obtiene el estado de un índice
|
|
262
|
-
getState(idx) {
|
|
263
|
-
return this.modelosChk[idx];
|
|
264
|
-
}
|
|
265
|
-
getDataMultiple(idx) {
|
|
266
|
-
const camposMod = Object.keys(this.modelosChk).filter(key => key.split('.')[0] == idx);
|
|
267
|
-
const vRet = {};
|
|
268
|
-
camposMod.forEach(key => {
|
|
269
|
-
vRet[key.split('.')[1]] = this.modelosChk[key];
|
|
270
|
-
});
|
|
271
|
-
return vRet;
|
|
272
|
-
}
|
|
273
|
-
// Genera una lista basada en el estado de los índices
|
|
274
|
-
generarLista(tipoRetorno = null, esCampoNumerico = false) {
|
|
275
|
-
const strLista = [];
|
|
276
|
-
const objLista = {};
|
|
277
|
-
Object.keys(this.modelosChk).forEach(key => {
|
|
278
|
-
if ((esCampoNumerico && esNumero(this.modelosChk[key])) ||
|
|
279
|
-
(this.modelosChk[key])) {
|
|
280
|
-
strLista.push(key);
|
|
281
|
-
objLista[key] = this.modelosChk[key];
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
if (tipoRetorno === 'array') {
|
|
285
|
-
return strLista;
|
|
286
|
-
}
|
|
287
|
-
if (tipoRetorno === 'object') {
|
|
288
|
-
return objLista;
|
|
289
|
-
}
|
|
290
|
-
return strLista.join(',');
|
|
291
|
-
}
|
|
292
|
-
generarFormGroupFromModelosChk(tipo) {
|
|
293
|
-
const formGroupObj = {};
|
|
294
|
-
let validadores = [];
|
|
295
|
-
if (tipo == 'number') {
|
|
296
|
-
validadores = [
|
|
297
|
-
Validators.required,
|
|
298
|
-
Validators.min(1)
|
|
299
|
-
];
|
|
300
|
-
}
|
|
301
|
-
Object.keys(this.modelosChk).forEach(key => {
|
|
302
|
-
formGroupObj[key] = new FormControl(this.modelosChk[key], validadores);
|
|
303
|
-
});
|
|
304
|
-
return new FormGroup(formGroupObj);
|
|
305
|
-
// return this.formBuilder.group(formGroupObj);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
class ForCheckboxModel {
|
|
309
|
-
modeloCheck;
|
|
310
|
-
constructor(modeloCheck) {
|
|
311
|
-
this.modeloCheck = modeloCheck;
|
|
312
|
-
}
|
|
313
|
-
get cantidadActivos() {
|
|
314
|
-
return Object.values(this.modeloCheck.modelosChk).filter(Boolean).length;
|
|
315
|
-
}
|
|
316
|
-
get existenActivados() {
|
|
317
|
-
return this.cantidadActivos > 0;
|
|
318
|
-
}
|
|
319
|
-
get todosActivos() {
|
|
320
|
-
const total = Object.keys(this.modeloCheck.modelosChk).length;
|
|
321
|
-
const activos = this.cantidadActivos;
|
|
322
|
-
return activos > 0 && total === activos;
|
|
323
|
-
}
|
|
324
|
-
get algunosActivos() {
|
|
325
|
-
const total = Object.keys(this.modeloCheck.modelosChk).length;
|
|
326
|
-
const activos = this.cantidadActivos;
|
|
327
|
-
return activos > 0 && total !== activos;
|
|
328
|
-
}
|
|
329
|
-
establecerTodos(activo) {
|
|
330
|
-
Object.keys(this.modeloCheck.modelosChk).forEach(idx => this.modeloCheck.modelosChk[idx] = activo);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
function tipoValorFuncion(datoParam, defaultValue, ...param) {
|
|
335
|
-
if (datoParam === undefined || datoParam === null) {
|
|
336
|
-
return defaultValue; // Retorna el valor por defecto si es undefined
|
|
337
|
-
}
|
|
338
|
-
if (typeof datoParam === 'function') {
|
|
339
|
-
return datoParam(...param);
|
|
340
|
-
}
|
|
341
|
-
return datoParam;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
class MatRowKeyboardSelectionDirective {
|
|
345
|
-
el;
|
|
346
|
-
rows;
|
|
347
|
-
renderedData;
|
|
348
|
-
tabla; // Entrada: Referencia a la tabla
|
|
349
|
-
rowModel; // Entrada: Modelo de fila actual
|
|
350
|
-
seleccionarSiguiente = new EventEmitter(); // Salida: Evento al seleccionar siguiente
|
|
351
|
-
unsubscriber$ = new Subject();
|
|
352
|
-
constructor(el) {
|
|
353
|
-
this.el = el;
|
|
354
|
-
}
|
|
355
|
-
ngOnInit() {
|
|
356
|
-
// Asignar tabindex si no está definido
|
|
357
|
-
if (this.el.nativeElement.tabIndex < 0) {
|
|
358
|
-
this.el.nativeElement.tabIndex = 0;
|
|
359
|
-
}
|
|
360
|
-
// Obtener la fuente de datos de la tabla
|
|
361
|
-
const dataSource = this.tabla.dataSource;
|
|
362
|
-
// Suscribirse a los cambios en los datos
|
|
363
|
-
dataSource.connect().pipe(takeUntil(this.unsubscriber$)).subscribe(data => {
|
|
364
|
-
this.renderedData = data;
|
|
365
|
-
this.rows = Array.from(this.getTableRows());
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
ngOnDestroy() {
|
|
369
|
-
// Finalizar la suscripción al destruir la directiva
|
|
370
|
-
this.unsubscriber$.next(null);
|
|
371
|
-
this.unsubscriber$.complete();
|
|
372
|
-
}
|
|
373
|
-
onKeydown(event) {
|
|
374
|
-
var element = event.target;
|
|
375
|
-
if (element.tagName === "INPUT") {
|
|
376
|
-
event.stopPropagation();
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
const currentIndex = this.renderedData.findIndex(row => row === this.rowModel);
|
|
380
|
-
const eRef = event.target;
|
|
381
|
-
this.rows = this.rows.filter(elem => elem.hasAttribute('id'));
|
|
382
|
-
const arrayFilas = Array.from(this.rows);
|
|
383
|
-
const fElem = arrayFilas.filter(elem => elem.id == eRef.id).pop();
|
|
384
|
-
const cElemIdx = arrayFilas.findIndex(elem => elem == fElem);
|
|
385
|
-
let newRow;
|
|
386
|
-
// Controlar las teclas presionadas
|
|
387
|
-
switch (event.key) {
|
|
388
|
-
case 'ArrowDown':
|
|
389
|
-
newRow = this.rows[cElemIdx + 1];
|
|
390
|
-
break;
|
|
391
|
-
case 'ArrowUp':
|
|
392
|
-
newRow = this.rows[cElemIdx - 1];
|
|
393
|
-
break;
|
|
394
|
-
case 'Enter':
|
|
395
|
-
case ' ':
|
|
396
|
-
this.seleccionarSiguiente.next(this.renderedData[currentIndex]);
|
|
397
|
-
event.preventDefault();
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
// Enfocar la nueva fila seleccionada
|
|
401
|
-
if (newRow) {
|
|
402
|
-
newRow.classList.add('estaFocus');
|
|
403
|
-
newRow.focus();
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
getTableRows() {
|
|
408
|
-
let el = this.el.nativeElement;
|
|
409
|
-
// Recorrer los elementos padres hasta encontrar la tabla
|
|
410
|
-
while (el && el.parentNode) {
|
|
411
|
-
el = el.parentNode;
|
|
412
|
-
// Verificar si es una tabla de material
|
|
413
|
-
if (el.tagName && el.tagName.toLowerCase() === 'mat-table' || el.hasAttribute('mat-table')) {
|
|
414
|
-
return el.querySelectorAll('mat-row, tr[mat-row]');
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
return undefined;
|
|
418
|
-
}
|
|
419
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
420
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.7", type: MatRowKeyboardSelectionDirective, isStandalone: true, selector: "[matRowKeyboardSelection]", inputs: { tabla: ["matRowKeyboardSelection", "tabla"], rowModel: "rowModel" }, outputs: { seleccionarSiguiente: "seleccionarSiguiente" }, host: { listeners: { "keydown": "onKeydown($event)" } }, ngImport: i0 });
|
|
421
|
-
}
|
|
422
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, decorators: [{
|
|
423
|
-
type: Directive,
|
|
424
|
-
args: [{
|
|
425
|
-
selector: '[matRowKeyboardSelection]'
|
|
426
|
-
}]
|
|
427
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { tabla: [{
|
|
428
|
-
type: Input,
|
|
429
|
-
args: ['matRowKeyboardSelection']
|
|
430
|
-
}], rowModel: [{
|
|
431
|
-
type: Input
|
|
432
|
-
}], seleccionarSiguiente: [{
|
|
433
|
-
type: Output
|
|
434
|
-
}], onKeydown: [{
|
|
435
|
-
type: HostListener,
|
|
436
|
-
args: ['keydown', ['$event']]
|
|
437
|
-
}] } });
|
|
438
|
-
|
|
439
|
-
class ColumnTypeComponent {
|
|
440
|
-
table;
|
|
441
|
-
column;
|
|
442
|
-
columnDef;
|
|
443
|
-
columnTitleTemplate; // Permite personalizar títulos
|
|
444
|
-
columnFooterTemplate; // Permite personalizar footer
|
|
445
|
-
cellTemplate; // Se usa para el contenido de las celdas
|
|
446
|
-
constructor(table) {
|
|
447
|
-
this.table = table;
|
|
448
|
-
}
|
|
449
|
-
ngOnInit() {
|
|
450
|
-
}
|
|
451
|
-
ngAfterViewInit() {
|
|
452
|
-
if (this.columnDef) {
|
|
453
|
-
this.table.addColumnDef(this.columnDef);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
accionClick(item, event) {
|
|
457
|
-
if (this.column.click) {
|
|
458
|
-
this.column.click(item);
|
|
459
|
-
event.stopPropagation();
|
|
460
|
-
}
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeComponent, deps: [{ token: i2.MatTable, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
464
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeComponent, isStandalone: false, selector: "jvs-column-type", inputs: { column: "column", columnTitleTemplate: "columnTitleTemplate", columnFooterTemplate: "columnFooterTemplate", cellTemplate: "cellTemplate" }, viewQueries: [{ propertyName: "columnDef", first: true, predicate: MatColumnDef, descendants: true, static: true }], ngImport: i0, template: "<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <ng-container *ngIf=\"columnTitleTemplate; else defaultTitle\">\n <ng-container *ngTemplateOutlet=\"columnTitleTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultTitle>\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </ng-template>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { row: row, column: column }\"></ng-container>\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n <ng-container *ngIf=\"columnFooterTemplate; else defaultFooter\">\n <ng-container *ngTemplateOutlet=\"columnFooterTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultFooter>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </ng-template>\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }] });
|
|
465
|
-
}
|
|
466
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeComponent, decorators: [{
|
|
467
|
-
type: Component,
|
|
468
|
-
args: [{ selector: 'jvs-column-type', standalone: false, template: "<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <ng-container *ngIf=\"columnTitleTemplate; else defaultTitle\">\n <ng-container *ngTemplateOutlet=\"columnTitleTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultTitle>\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </ng-template>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { row: row, column: column }\"></ng-container>\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n <ng-container *ngIf=\"columnFooterTemplate; else defaultFooter\">\n <ng-container *ngTemplateOutlet=\"columnFooterTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultFooter>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </ng-template>\n </th>\n</ng-container>\n" }]
|
|
469
|
-
}], ctorParameters: () => [{ type: i2.MatTable, decorators: [{
|
|
470
|
-
type: Optional
|
|
471
|
-
}] }], propDecorators: { column: [{
|
|
472
|
-
type: Input,
|
|
473
|
-
args: [{ required: true }]
|
|
474
|
-
}], columnDef: [{
|
|
475
|
-
type: ViewChild,
|
|
476
|
-
args: [MatColumnDef, { static: true }]
|
|
477
|
-
}], columnTitleTemplate: [{
|
|
478
|
-
type: Input
|
|
479
|
-
}], columnFooterTemplate: [{
|
|
480
|
-
type: Input
|
|
481
|
-
}], cellTemplate: [{
|
|
482
|
-
type: Input
|
|
483
|
-
}] } });
|
|
484
|
-
|
|
485
|
-
class ColumnTypeNumberComponent extends ColumnTypeComponent {
|
|
486
|
-
column = {};
|
|
487
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeNumberComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
488
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeNumberComponent, isStandalone: false, selector: "jvs-column-type-number", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "\n<ng-template #cellTemplate let-row=\"row\">\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}\n\t\t\t\t</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
489
|
-
}
|
|
490
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeNumberComponent, decorators: [{
|
|
491
|
-
type: Component,
|
|
492
|
-
args: [{ selector: 'jvs-column-type-number', standalone: false, template: "\n<ng-template #cellTemplate let-row=\"row\">\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}\n\t\t\t\t</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
|
|
493
|
-
}], propDecorators: { column: [{
|
|
494
|
-
type: Input,
|
|
495
|
-
args: [{ required: true }]
|
|
496
|
-
}] } });
|
|
497
|
-
|
|
498
|
-
class ColumnTypeDateComponent extends ColumnTypeComponent {
|
|
499
|
-
column = {};
|
|
500
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeDateComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
501
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeDateComponent, isStandalone: false, selector: "jvs-column-type-date", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n {{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
502
|
-
}
|
|
503
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeDateComponent, decorators: [{
|
|
504
|
-
type: Component,
|
|
505
|
-
args: [{ selector: 'jvs-column-type-date', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n {{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
|
|
506
|
-
}], propDecorators: { column: [{
|
|
507
|
-
type: Input,
|
|
508
|
-
args: [{ required: true }]
|
|
509
|
-
}] } });
|
|
510
|
-
|
|
511
|
-
const YES_ICON = `
|
|
512
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M21 7L9 19l-5.5-5.5l1.41-1.41L9 16.17L19.59 5.59z"/></svg>
|
|
513
|
-
`;
|
|
514
|
-
const NO_ICON = `
|
|
515
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z"/></svg>
|
|
516
|
-
`;
|
|
517
|
-
class ColumnTypeSinoComponent extends ColumnTypeComponent {
|
|
518
|
-
column = {}; // 🟢 Solución
|
|
519
|
-
constructor() {
|
|
520
|
-
super(inject(MatTable)); // 🟢 Llamar al constructor del padre
|
|
521
|
-
const iconRegistry = inject(MatIconRegistry);
|
|
522
|
-
const sanitizer = inject(DomSanitizer);
|
|
523
|
-
// Note that we provide the icon here as a string literal here due to a limitation in
|
|
524
|
-
// Stackblitz. If you want to provide the icon from a URL, you can use:
|
|
525
|
-
// `iconRegistry.addSvgIcon('thumbs-up', sanitizer.bypassSecurityTrustResourceUrl('icon.svg'));`
|
|
526
|
-
iconRegistry.addSvgIconLiteralInNamespace('yes_no', 'yes', sanitizer.bypassSecurityTrustHtml(YES_ICON));
|
|
527
|
-
iconRegistry.addSvgIconLiteralInNamespace('yes_no', 'no', sanitizer.bypassSecurityTrustHtml(NO_ICON));
|
|
528
|
-
// iconRegistry.addSvgIconLiteral('yesIcon', sanitizer.bypassSecurityTrustHtml(YES_ICON));
|
|
529
|
-
// iconRegistry.addSvgIconLiteral('noIcon', sanitizer.bypassSecurityTrustHtml(NO_ICON));
|
|
530
|
-
}
|
|
531
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeSinoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
532
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeSinoComponent, isStandalone: false, selector: "jvs-column-type-sino", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <mat-icon *ngIf=\"[column.yesValue, 1, true].includes(row[column.property])\"\n [svgIcon]=\"column.yesIcon ?? 'yes_no:yes'\" class=\"icon-sm\"\n [matTooltip]=\"column.yesTooltip ?? undefined\"\n ></mat-icon>\n <mat-icon *ngIf=\"[column.noValue, 0, false].includes(row[column.property])\" [svgIcon]=\"column.noIcon ?? 'yes_no:no'\"\n class=\"icon-sm\"\n [matTooltip]=\"column.noTooltip ?? undefined\"\n ></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
533
|
-
}
|
|
534
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeSinoComponent, decorators: [{
|
|
535
|
-
type: Component,
|
|
536
|
-
args: [{ selector: 'jvs-column-type-sino', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <mat-icon *ngIf=\"[column.yesValue, 1, true].includes(row[column.property])\"\n [svgIcon]=\"column.yesIcon ?? 'yes_no:yes'\" class=\"icon-sm\"\n [matTooltip]=\"column.yesTooltip ?? undefined\"\n ></mat-icon>\n <mat-icon *ngIf=\"[column.noValue, 0, false].includes(row[column.property])\" [svgIcon]=\"column.noIcon ?? 'yes_no:no'\"\n class=\"icon-sm\"\n [matTooltip]=\"column.noTooltip ?? undefined\"\n ></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
|
|
537
|
-
}], ctorParameters: () => [], propDecorators: { column: [{
|
|
538
|
-
type: Input,
|
|
539
|
-
args: [{ required: true }]
|
|
540
|
-
}] } });
|
|
541
|
-
|
|
542
|
-
class ProgressBarComponent {
|
|
543
|
-
objThis;
|
|
544
|
-
porcentaje = 0;
|
|
545
|
-
textoCentrado = false;
|
|
546
|
-
_textoMostrar = '';
|
|
547
|
-
get textoMostrar() { return this._textoMostrar; }
|
|
548
|
-
set textoMostrar(val) { this._textoMostrar = val; }
|
|
549
|
-
_formatoNumero = '';
|
|
550
|
-
get formatoNumero() { return this._formatoNumero; }
|
|
551
|
-
set formatoNumero(val) { this._formatoNumero = val ?? '1.0-0'; }
|
|
552
|
-
_coloresValor = [];
|
|
553
|
-
get coloresValor() { return this._coloresValor; }
|
|
554
|
-
set coloresValor(val) {
|
|
555
|
-
if (!val || !Array.isArray(val)) {
|
|
556
|
-
this._coloresValor = [
|
|
557
|
-
{ valorMaximo: 1, class: 'p-0' },
|
|
558
|
-
{ valorMaximo: 40, class: 'bg-red-400 text-red-900' },
|
|
559
|
-
// {valorMaximo: 35, class: 'bg-red-600 text-red-100'},
|
|
560
|
-
{ valorMaximo: 80, class: 'bg-yellow-600 text-yellow-100' },
|
|
561
|
-
{ valorMaximo: 100, class: 'bg-green-600 text-green-100' },
|
|
562
|
-
];
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
this._coloresValor = val;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
constructor() { }
|
|
569
|
-
ngOnInit() {
|
|
570
|
-
}
|
|
571
|
-
colorEstilo() {
|
|
572
|
-
let estiloFin = null;
|
|
573
|
-
let claseFin = null;
|
|
574
|
-
let encontro = false;
|
|
575
|
-
this.coloresValor = this.ordenarPorPropiedad(this.coloresValor, 'valorMaximo');
|
|
576
|
-
this.coloresValor.forEach(estilo => {
|
|
577
|
-
if (!encontro && (this.porcentaje <= estilo.valorMaximo)) {
|
|
578
|
-
// console.log(this.porcentaje, estilo, (this.porcentaje < estilo.valorMaximo));
|
|
579
|
-
encontro = true;
|
|
580
|
-
estiloFin = estilo.style;
|
|
581
|
-
claseFin = estilo.class;
|
|
582
|
-
}
|
|
583
|
-
});
|
|
584
|
-
return {
|
|
585
|
-
style: estiloFin ?? '',
|
|
586
|
-
class: claseFin ?? '',
|
|
587
|
-
};
|
|
588
|
-
}
|
|
589
|
-
ordenarPorPropiedad(objData, propiedad, numeros = false) {
|
|
590
|
-
if (numeros) {
|
|
591
|
-
return objData.sort((a, b) => a[propiedad] - b[propiedad]);
|
|
592
|
-
}
|
|
593
|
-
return objData.sort((a, b) => (a[propiedad] > b[propiedad]) ? 1 : ((b[propiedad] > a[propiedad]) ? -1 : 0));
|
|
594
|
-
}
|
|
595
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
596
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ProgressBarComponent, isStandalone: true, selector: "jvs-progress-bar", inputs: { objThis: "objThis", porcentaje: "porcentaje", textoCentrado: "textoCentrado", textoMostrar: "textoMostrar", formatoNumero: "formatoNumero", coloresValor: "coloresValor" }, host: { classAttribute: "jvs-progress-bar" }, ngImport: i0, template: "<div class=\"w-full bg-gray-200 text-gray-700 rounded-full\" [class.text-center]=\"textoCentrado\">\n\t<div class=\"text-xxs font-medium text-center p-1 leading-none rounded-full\"\n\t\t [ngClass]=\"colorEstilo().class ? colorEstilo().class : 'bg-blue-600 text-blue-100'\"\n\t\t [style]=\"colorEstilo().style ? colorEstilo().style : ''\"\n\t\t [style.width]=\"(textoCentrado ? 100 : porcentaje) + '%'\"\n\t>\n <span *ngIf=\"textoMostrar else defaultText;\" class=\"whitespace-nowrap\">{{ textoMostrar }}</span>\n <ng-template #defaultText>{{ porcentaje | number: formatoNumero }}%</ng-template>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
597
|
-
}
|
|
598
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, decorators: [{
|
|
599
|
-
type: Component,
|
|
600
|
-
args: [{ selector: 'jvs-progress-bar', imports: [
|
|
601
|
-
CommonModule,
|
|
602
|
-
DecimalPipe
|
|
603
|
-
], host: {
|
|
604
|
-
class: 'jvs-progress-bar',
|
|
605
|
-
}, template: "<div class=\"w-full bg-gray-200 text-gray-700 rounded-full\" [class.text-center]=\"textoCentrado\">\n\t<div class=\"text-xxs font-medium text-center p-1 leading-none rounded-full\"\n\t\t [ngClass]=\"colorEstilo().class ? colorEstilo().class : 'bg-blue-600 text-blue-100'\"\n\t\t [style]=\"colorEstilo().style ? colorEstilo().style : ''\"\n\t\t [style.width]=\"(textoCentrado ? 100 : porcentaje) + '%'\"\n\t>\n <span *ngIf=\"textoMostrar else defaultText;\" class=\"whitespace-nowrap\">{{ textoMostrar }}</span>\n <ng-template #defaultText>{{ porcentaje | number: formatoNumero }}%</ng-template>\n </div>\n</div>\n" }]
|
|
606
|
-
}], ctorParameters: () => [], propDecorators: { objThis: [{
|
|
607
|
-
type: Input
|
|
608
|
-
}], porcentaje: [{
|
|
609
|
-
type: Input
|
|
610
|
-
}], textoCentrado: [{
|
|
611
|
-
type: Input
|
|
612
|
-
}], textoMostrar: [{
|
|
613
|
-
type: Input
|
|
614
|
-
}], formatoNumero: [{
|
|
615
|
-
type: Input
|
|
616
|
-
}], coloresValor: [{
|
|
617
|
-
type: Input
|
|
618
|
-
}] } });
|
|
619
|
-
|
|
620
|
-
class ColumnTypeProgressbarComponent extends ColumnTypeComponent {
|
|
621
|
-
column = {};
|
|
622
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeProgressbarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
623
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeProgressbarComponent, isStandalone: false, selector: "jvs-column-type-progressbar", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <jvs-progress-bar\n [textoCentrado]=\"!!column.progressbar.textoCentrado\"\n [porcentaje]=\"column.progressbar.porcentaje(row)\"\n [coloresValor]=\"column.progressbar.coloresValor\"\n [formatoNumero]=\"column.progressbar.formatoNumero\"\n [textoMostrar]=\"column.progressbar.textoMostrar ? column.progressbar.textoMostrar(row) : ''\"\n ></jvs-progress-bar>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: ProgressBarComponent, selector: "jvs-progress-bar", inputs: ["objThis", "porcentaje", "textoCentrado", "textoMostrar", "formatoNumero", "coloresValor"] }] });
|
|
624
|
-
}
|
|
625
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeProgressbarComponent, decorators: [{
|
|
626
|
-
type: Component,
|
|
627
|
-
args: [{ selector: 'jvs-column-type-progressbar', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <jvs-progress-bar\n [textoCentrado]=\"!!column.progressbar.textoCentrado\"\n [porcentaje]=\"column.progressbar.porcentaje(row)\"\n [coloresValor]=\"column.progressbar.coloresValor\"\n [formatoNumero]=\"column.progressbar.formatoNumero\"\n [textoMostrar]=\"column.progressbar.textoMostrar ? column.progressbar.textoMostrar(row) : ''\"\n ></jvs-progress-bar>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
|
|
628
|
-
}], propDecorators: { column: [{
|
|
629
|
-
type: Input,
|
|
630
|
-
args: [{ required: true }]
|
|
631
|
-
}] } });
|
|
632
|
-
|
|
633
|
-
class NoSanitizePipe {
|
|
634
|
-
domSanitizer;
|
|
635
|
-
constructor(domSanitizer) {
|
|
636
|
-
this.domSanitizer = domSanitizer;
|
|
637
|
-
}
|
|
638
|
-
transform(html) {
|
|
639
|
-
return this.domSanitizer.bypassSecurityTrustHtml(html);
|
|
640
|
-
}
|
|
641
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
642
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, isStandalone: true, name: "noSanitize" });
|
|
643
|
-
}
|
|
644
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, decorators: [{
|
|
645
|
-
type: Pipe,
|
|
646
|
-
args: [{ name: 'noSanitize' }]
|
|
647
|
-
}], ctorParameters: () => [{ type: i1$1.DomSanitizer }] });
|
|
648
|
-
|
|
649
|
-
class ZeroFillPipe {
|
|
650
|
-
transform(value, digitos, ...args) {
|
|
651
|
-
let s = value + '';
|
|
652
|
-
while (s.length < digitos) {
|
|
653
|
-
s = '0' + s;
|
|
654
|
-
}
|
|
655
|
-
return s;
|
|
656
|
-
}
|
|
657
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
658
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, isStandalone: true, name: "zeroFill" });
|
|
659
|
-
}
|
|
660
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, decorators: [{
|
|
661
|
-
type: Pipe,
|
|
662
|
-
args: [{
|
|
663
|
-
name: 'zeroFill',
|
|
664
|
-
}]
|
|
665
|
-
}] });
|
|
666
|
-
function zeroFill(value, digitos, ...args) {
|
|
667
|
-
return new ZeroFillPipe().transform(value, digitos, args);
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
// export * from './progress-spinner.service';
|
|
671
|
-
|
|
672
|
-
class ColumnTypeTextComponent extends ColumnTypeComponent {
|
|
673
|
-
column = {}; // 🟢 Solución
|
|
674
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeTextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
675
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeTextComponent, isStandalone: false, selector: "jvs-column-type-text", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <div *ngIf=\"column.innerHTML; else sinInnerHTML\" [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n </div>\n <ng-template #sinInnerHTML>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<!--<ng-container matColumnDef=\"{{ column.property }}\">\n<th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n</th>\n<ng-container *ngIf=\"column.innerHTML; else sinInnerHTML\">\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(column, row, $event)\">\n <div [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n\n </div>\n </td>\n</ng-container>\n<ng-template #sinInnerHTML>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </td>\n</ng-template>\n<th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n</th>\n</ng-container>-->\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\"\n let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">\n <span *ngIf=\"!fila.zeroFill\">{{ value }}</span>\n <span *ngIf=\"fila.zeroFill\">{{ value | zeroFill: fila.zeroFill }}</span>\n </span></ng-container>\n <ng-container *ngSwitchCase=\"'date'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | number: (format || '0.0-2') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'money'\"><span [ngClass]=\"clase\"\n [class.text-sky-700]=\"(value * 1) >= 0\" [class.text-red-700]=\"(value * 1) < 0\"\n *ngIf=\"value\" (click)=\"accionClick(row, $event)\">{{ value | number: (format || '1.2-2') }}</span>\n </ng-container>\n\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'date'\">{{ value | date: (format || 'dd/MM/yyyy') }}</span>-->\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'number'\">{{ value | number: (format || '0.0-2') }}</span>-->\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: NoSanitizePipe, name: "noSanitize" }, { kind: "pipe", type: ZeroFillPipe, name: "zeroFill" }] });
|
|
676
|
-
}
|
|
677
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeTextComponent, decorators: [{
|
|
678
|
-
type: Component,
|
|
679
|
-
args: [{ selector: 'jvs-column-type-text', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <div *ngIf=\"column.innerHTML; else sinInnerHTML\" [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n </div>\n <ng-template #sinInnerHTML>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<!--<ng-container matColumnDef=\"{{ column.property }}\">\n<th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n</th>\n<ng-container *ngIf=\"column.innerHTML; else sinInnerHTML\">\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(column, row, $event)\">\n <div [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n\n </div>\n </td>\n</ng-container>\n<ng-template #sinInnerHTML>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </td>\n</ng-template>\n<th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n</th>\n</ng-container>-->\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\"\n let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">\n <span *ngIf=\"!fila.zeroFill\">{{ value }}</span>\n <span *ngIf=\"fila.zeroFill\">{{ value | zeroFill: fila.zeroFill }}</span>\n </span></ng-container>\n <ng-container *ngSwitchCase=\"'date'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | number: (format || '0.0-2') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'money'\"><span [ngClass]=\"clase\"\n [class.text-sky-700]=\"(value * 1) >= 0\" [class.text-red-700]=\"(value * 1) < 0\"\n *ngIf=\"value\" (click)=\"accionClick(row, $event)\">{{ value | number: (format || '1.2-2') }}</span>\n </ng-container>\n\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'date'\">{{ value | date: (format || 'dd/MM/yyyy') }}</span>-->\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'number'\">{{ value | number: (format || '0.0-2') }}</span>-->\n </ng-container>\n</ng-template>\n" }]
|
|
680
|
-
}], propDecorators: { column: [{
|
|
681
|
-
type: Input,
|
|
682
|
-
args: [{ required: true }]
|
|
683
|
-
}] } });
|
|
684
|
-
|
|
685
|
-
class ColumnTypeMoneyComponent extends ColumnTypeComponent {
|
|
686
|
-
column = {};
|
|
687
|
-
value(row) {
|
|
688
|
-
return (this.column.transformar ? this.column.transformar(row) : row[this.column.property]);
|
|
689
|
-
}
|
|
690
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeMoneyComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
691
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeMoneyComponent, isStandalone: false, selector: "jvs-column-type-money", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <span [ngClass]=\"column.textCss\"\n [class.text-sky-700]=\"(value(row)) >= 0\" [class.text-red-700]=\"(value(row)) < 0\"\n *ngIf=\"value(row)\"\n (click)=\"accionClick(row, $event)\">{{ value(row) | number: (column.format || '1.2-2') }}</span>\n</ng-template>\n<ng-template #columnFooterTemplate let-row=\"row\">\n\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n</ng-template>\n\n<!--<jvs-column-type [column]=\"column\" [cellTemplate]=\"cellTemplate\" [columnFooterTemplate]=\"columnFooterTemplate\"></jvs-column-type>-->\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n \t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }] });
|
|
692
|
-
}
|
|
693
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeMoneyComponent, decorators: [{
|
|
694
|
-
type: Component,
|
|
695
|
-
args: [{ selector: 'jvs-column-type-money', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <span [ngClass]=\"column.textCss\"\n [class.text-sky-700]=\"(value(row)) >= 0\" [class.text-red-700]=\"(value(row)) < 0\"\n *ngIf=\"value(row)\"\n (click)=\"accionClick(row, $event)\">{{ value(row) | number: (column.format || '1.2-2') }}</span>\n</ng-template>\n<ng-template #columnFooterTemplate let-row=\"row\">\n\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n</ng-template>\n\n<!--<jvs-column-type [column]=\"column\" [cellTemplate]=\"cellTemplate\" [columnFooterTemplate]=\"columnFooterTemplate\"></jvs-column-type>-->\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n \t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n </th>\n</ng-container>\n" }]
|
|
696
|
-
}], propDecorators: { column: [{
|
|
697
|
-
type: Input,
|
|
698
|
-
args: [{ required: true }]
|
|
699
|
-
}] } });
|
|
700
|
-
|
|
701
|
-
class ColumnTypeIconsComponent extends ColumnTypeComponent {
|
|
702
|
-
column = {};
|
|
703
|
-
obtenerItems(columna, row) {
|
|
704
|
-
if (typeof columna.items === 'function') {
|
|
705
|
-
return columna.items(row);
|
|
706
|
-
}
|
|
707
|
-
return columna.items;
|
|
708
|
-
}
|
|
709
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeIconsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
710
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeIconsComponent, isStandalone: false, selector: "jvs-column-type-icons", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <div class=\"flex items-center justify-center\" [ngClass]=\"{ '-space-x-1': !column.iconsDef?.soloIcono }\"\n >\n <ng-container *ngFor=\"let icon of obtenerItems(column.iconsDef, row)\">\n <ng-container *ngIf=\"!column.iconsDef?.soloIcono; else soloIcono\">\n <button matRipple type=\"button\" *ngIf=\"!icon.esVisible || icon.esVisible(row)\"\n (click)=\"icon.click ? icon.click(row) : false; $event.stopPropagation()\"\n class=\"flex items-center justify-center p-1 rounded border shadow-sm hover:shadow-lg\"\n [ngClass]=\"icon.contentCss\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </button>\n </ng-container>\n <ng-template #soloIcono>\n <div *ngIf=\"!icon.esVisible || icon.esVisible(row)\" [ngClass]=\"icon.contentCss\"\n class=\"flex items-center\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<ng-template #iconoConTamanio let-icon=\"icon\" let-iconClass=\"iconClass\" let-size=\"size\">\n <mat-icon *ngIf=\"size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\" [inline]=\"true\"\n [style.font-size]=\"size\"\n [style.height]=\"size\"\n [style.width]=\"size\"\n ></mat-icon>\n <mat-icon *ngIf=\"!size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\"></mat-icon>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
711
|
-
}
|
|
712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeIconsComponent, decorators: [{
|
|
713
|
-
type: Component,
|
|
714
|
-
args: [{ selector: 'jvs-column-type-icons', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <div class=\"flex items-center justify-center\" [ngClass]=\"{ '-space-x-1': !column.iconsDef?.soloIcono }\"\n >\n <ng-container *ngFor=\"let icon of obtenerItems(column.iconsDef, row)\">\n <ng-container *ngIf=\"!column.iconsDef?.soloIcono; else soloIcono\">\n <button matRipple type=\"button\" *ngIf=\"!icon.esVisible || icon.esVisible(row)\"\n (click)=\"icon.click ? icon.click(row) : false; $event.stopPropagation()\"\n class=\"flex items-center justify-center p-1 rounded border shadow-sm hover:shadow-lg\"\n [ngClass]=\"icon.contentCss\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </button>\n </ng-container>\n <ng-template #soloIcono>\n <div *ngIf=\"!icon.esVisible || icon.esVisible(row)\" [ngClass]=\"icon.contentCss\"\n class=\"flex items-center\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<ng-template #iconoConTamanio let-icon=\"icon\" let-iconClass=\"iconClass\" let-size=\"size\">\n <mat-icon *ngIf=\"size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\" [inline]=\"true\"\n [style.font-size]=\"size\"\n [style.height]=\"size\"\n [style.width]=\"size\"\n ></mat-icon>\n <mat-icon *ngIf=\"!size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\"></mat-icon>\n</ng-template>\n" }]
|
|
715
|
-
}], propDecorators: { column: [{
|
|
716
|
-
type: Input,
|
|
717
|
-
args: [{ required: true }]
|
|
718
|
-
}] } });
|
|
719
|
-
|
|
720
|
-
class ColumnTypeModule {
|
|
721
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
722
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, declarations: [ColumnTypeComponent,
|
|
723
|
-
ColumnTypeTextComponent,
|
|
724
|
-
ColumnTypeMoneyComponent,
|
|
725
|
-
ColumnTypeNumberComponent,
|
|
726
|
-
ColumnTypeDateComponent,
|
|
727
|
-
ColumnTypeIconsComponent,
|
|
728
|
-
ColumnTypeSinoComponent,
|
|
729
|
-
ColumnTypeProgressbarComponent], imports: [CommonModule,
|
|
730
|
-
MatTableModule,
|
|
731
|
-
MatSortModule,
|
|
732
|
-
MatTooltipModule,
|
|
733
|
-
NoSanitizePipe,
|
|
734
|
-
ZeroFillPipe,
|
|
735
|
-
MatRipple,
|
|
736
|
-
MatIcon,
|
|
737
|
-
ProgressBarComponent], exports: [ColumnTypeTextComponent,
|
|
738
|
-
ColumnTypeMoneyComponent,
|
|
739
|
-
ColumnTypeNumberComponent,
|
|
740
|
-
ColumnTypeDateComponent,
|
|
741
|
-
ColumnTypeIconsComponent,
|
|
742
|
-
ColumnTypeSinoComponent,
|
|
743
|
-
ColumnTypeProgressbarComponent] });
|
|
744
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, imports: [CommonModule,
|
|
745
|
-
MatTableModule,
|
|
746
|
-
MatSortModule,
|
|
747
|
-
MatTooltipModule,
|
|
748
|
-
MatIcon,
|
|
749
|
-
ProgressBarComponent] });
|
|
750
|
-
}
|
|
751
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, decorators: [{
|
|
752
|
-
type: NgModule,
|
|
753
|
-
args: [{
|
|
754
|
-
declarations: [
|
|
755
|
-
ColumnTypeComponent,
|
|
756
|
-
ColumnTypeTextComponent,
|
|
757
|
-
ColumnTypeMoneyComponent,
|
|
758
|
-
ColumnTypeNumberComponent,
|
|
759
|
-
ColumnTypeDateComponent,
|
|
760
|
-
ColumnTypeIconsComponent,
|
|
761
|
-
ColumnTypeSinoComponent,
|
|
762
|
-
ColumnTypeProgressbarComponent,
|
|
763
|
-
],
|
|
764
|
-
imports: [
|
|
765
|
-
CommonModule,
|
|
766
|
-
MatTableModule,
|
|
767
|
-
MatSortModule,
|
|
768
|
-
MatTooltipModule,
|
|
769
|
-
NoSanitizePipe,
|
|
770
|
-
ZeroFillPipe,
|
|
771
|
-
MatRipple,
|
|
772
|
-
MatIcon,
|
|
773
|
-
ProgressBarComponent,
|
|
774
|
-
],
|
|
775
|
-
exports: [
|
|
776
|
-
ColumnTypeTextComponent,
|
|
777
|
-
ColumnTypeMoneyComponent,
|
|
778
|
-
ColumnTypeNumberComponent,
|
|
779
|
-
ColumnTypeDateComponent,
|
|
780
|
-
ColumnTypeIconsComponent,
|
|
781
|
-
ColumnTypeSinoComponent,
|
|
782
|
-
ColumnTypeProgressbarComponent,
|
|
783
|
-
]
|
|
784
|
-
}]
|
|
785
|
-
}] });
|
|
786
|
-
|
|
787
|
-
class TablaMantenimientoColumnDefsComponent {
|
|
788
|
-
table;
|
|
789
|
-
cdRef;
|
|
790
|
-
objThis;
|
|
791
|
-
nombreColeccion;
|
|
792
|
-
colDetalle;
|
|
793
|
-
chkLista; // = new DataModel();
|
|
794
|
-
chkListaChange = new EventEmitter();
|
|
795
|
-
columnDefLocales;
|
|
796
|
-
columnDefEnSubComponentes;
|
|
797
|
-
constructor(table, cdRef) {
|
|
798
|
-
this.table = table;
|
|
799
|
-
this.cdRef = cdRef;
|
|
800
|
-
}
|
|
801
|
-
ngAfterContentInit() {
|
|
802
|
-
if (this.table) {
|
|
803
|
-
this.cdRef.detectChanges();
|
|
804
|
-
this.columnDefEnSubComponentes.forEach(refCol => {
|
|
805
|
-
this.table.addColumnDef(refCol);
|
|
806
|
-
});
|
|
807
|
-
this.columnDefLocales.forEach(refCol => {
|
|
808
|
-
this.table.addColumnDef(refCol);
|
|
809
|
-
});
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
trackByProperty(index, column) {
|
|
813
|
-
return column.property;
|
|
814
|
-
}
|
|
815
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, deps: [{ token: i2.MatTable, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
816
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoColumnDefsComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento-column-defs", inputs: { objThis: "objThis", nombreColeccion: "nombreColeccion", colDetalle: "colDetalle", chkLista: "chkLista" }, outputs: { chkListaChange: "chkListaChange" }, queries: [{ propertyName: "columnDefEnSubComponentes", predicate: MatColumnDef, descendants: true }], viewQueries: [{ propertyName: "columnDefLocales", predicate: MatColumnDef, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n<ng-container *ngFor=\"let column of colDetalle; trackBy: trackByProperty\">\n\n <ng-container *ngIf=\"column.type === 'expandir'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef class=\"w-4\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"column.click\"\n (click)=\"column.click(row); row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"!column.click\"\n (click)=\"row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'checkbox'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"w-4 text-center\" mat-header-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"chkLista.checkbox.establecerTodos($event.checked)\"\n [indeterminate]=\"chkLista.checkbox.algunosActivos\"\n [checked]=\"chkLista.checkbox.todosActivos\"\n ></mat-checkbox>\n </th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"chkLista.modelosChk[chkLista.generarId(row, (column.chkField ?? column.property), column.chkFieldSeparador)]\"\n [ngModelOptions]=\"{standalone: true}\"\n ></mat-checkbox>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell\n mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n {{ column.property }}\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n\n <jvs-column-type-text *ngIf=\"column.type == 'text'\" [column]=\"column\"></jvs-column-type-text>\n <jvs-column-type-money *ngIf=\"column.type == 'money'\" [column]=\"column\"></jvs-column-type-money>\n <jvs-column-type-number *ngIf=\"column.type == 'number'\" [column]=\"column\"></jvs-column-type-number>\n <jvs-column-type-date *ngIf=\"column.type == 'date'\" [column]=\"column\"></jvs-column-type-date>\n <jvs-column-type-icons *ngIf=\"column.type == 'icons'\" [column]=\"column\"></jvs-column-type-icons>\n <jvs-column-type-sino *ngIf=\"column.type == 'yes_no'\" [column]=\"column\"></jvs-column-type-sino>\n <jvs-column-type-progressbar *ngIf=\"column.type == 'progress'\" [column]=\"column\"></jvs-column-type-progressbar>\n\n\n\n</ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ColumnTypeModule }, { kind: "component", type: ColumnTypeTextComponent, selector: "jvs-column-type-text", inputs: ["column"] }, { kind: "component", type: ColumnTypeMoneyComponent, selector: "jvs-column-type-money", inputs: ["column"] }, { kind: "component", type: ColumnTypeNumberComponent, selector: "jvs-column-type-number", inputs: ["column"] }, { kind: "component", type: ColumnTypeDateComponent, selector: "jvs-column-type-date", inputs: ["column"] }, { kind: "component", type: ColumnTypeIconsComponent, selector: "jvs-column-type-icons", inputs: ["column"] }, { kind: "component", type: ColumnTypeSinoComponent, selector: "jvs-column-type-sino", inputs: ["column"] }, { kind: "component", type: ColumnTypeProgressbarComponent, selector: "jvs-column-type-progressbar", inputs: ["column"] }] });
|
|
817
|
-
}
|
|
818
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, decorators: [{
|
|
819
|
-
type: Component,
|
|
820
|
-
args: [{ selector: 'jvs-tabla-mantenimiento-column-defs', standalone: true, imports: [
|
|
821
|
-
CommonModule,
|
|
822
|
-
MatCheckboxModule,
|
|
823
|
-
MatIconModule,
|
|
824
|
-
MatRippleModule,
|
|
825
|
-
MatSortModule,
|
|
826
|
-
MatTableModule,
|
|
827
|
-
MatTooltipModule,
|
|
828
|
-
ReactiveFormsModule,
|
|
829
|
-
FormsModule,
|
|
830
|
-
ColumnTypeModule,
|
|
831
|
-
], template: "<ng-content></ng-content>\n\n\n\n<ng-container *ngFor=\"let column of colDetalle; trackBy: trackByProperty\">\n\n <ng-container *ngIf=\"column.type === 'expandir'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef class=\"w-4\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"column.click\"\n (click)=\"column.click(row); row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"!column.click\"\n (click)=\"row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'checkbox'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"w-4 text-center\" mat-header-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"chkLista.checkbox.establecerTodos($event.checked)\"\n [indeterminate]=\"chkLista.checkbox.algunosActivos\"\n [checked]=\"chkLista.checkbox.todosActivos\"\n ></mat-checkbox>\n </th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"chkLista.modelosChk[chkLista.generarId(row, (column.chkField ?? column.property), column.chkFieldSeparador)]\"\n [ngModelOptions]=\"{standalone: true}\"\n ></mat-checkbox>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell\n mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n {{ column.property }}\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n\n <jvs-column-type-text *ngIf=\"column.type == 'text'\" [column]=\"column\"></jvs-column-type-text>\n <jvs-column-type-money *ngIf=\"column.type == 'money'\" [column]=\"column\"></jvs-column-type-money>\n <jvs-column-type-number *ngIf=\"column.type == 'number'\" [column]=\"column\"></jvs-column-type-number>\n <jvs-column-type-date *ngIf=\"column.type == 'date'\" [column]=\"column\"></jvs-column-type-date>\n <jvs-column-type-icons *ngIf=\"column.type == 'icons'\" [column]=\"column\"></jvs-column-type-icons>\n <jvs-column-type-sino *ngIf=\"column.type == 'yes_no'\" [column]=\"column\"></jvs-column-type-sino>\n <jvs-column-type-progressbar *ngIf=\"column.type == 'progress'\" [column]=\"column\"></jvs-column-type-progressbar>\n\n\n\n</ng-container>\n" }]
|
|
832
|
-
}], ctorParameters: () => [{ type: i2.MatTable, decorators: [{
|
|
833
|
-
type: Optional
|
|
834
|
-
}] }, { type: i0.ChangeDetectorRef }], propDecorators: { objThis: [{
|
|
835
|
-
type: Input
|
|
836
|
-
}], nombreColeccion: [{
|
|
837
|
-
type: Input
|
|
838
|
-
}], colDetalle: [{
|
|
839
|
-
type: Input
|
|
840
|
-
}], chkLista: [{
|
|
841
|
-
type: Input
|
|
842
|
-
}], chkListaChange: [{
|
|
843
|
-
type: Output
|
|
844
|
-
}], columnDefLocales: [{
|
|
845
|
-
type: ViewChildren,
|
|
846
|
-
args: [MatColumnDef]
|
|
847
|
-
}], columnDefEnSubComponentes: [{
|
|
848
|
-
type: ContentChildren,
|
|
849
|
-
args: [MatColumnDef, { descendants: true }]
|
|
850
|
-
}] } });
|
|
851
|
-
|
|
852
|
-
class TablaMantenimientoMenuComponent {
|
|
853
|
-
objThis;
|
|
854
|
-
nombreColeccion;
|
|
855
|
-
item;
|
|
856
|
-
derechosActuales;
|
|
857
|
-
// @Input() modalPrincipal;
|
|
858
|
-
// @Input() botonDisabled = (btn: BotonMantenimiento, item: any) => [];
|
|
859
|
-
opcionSelecionada = new EventEmitter();
|
|
860
|
-
menu;
|
|
861
|
-
subItems;
|
|
862
|
-
botonTemplate;
|
|
863
|
-
constructor() {
|
|
864
|
-
}
|
|
865
|
-
ngOnInit() {
|
|
866
|
-
}
|
|
867
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
868
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoMenuComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento-menu", inputs: { objThis: "objThis", nombreColeccion: "nombreColeccion", item: "item", derechosActuales: "derechosActuales", subItems: "subItems", botonTemplate: "botonTemplate" }, outputs: { opcionSelecionada: "opcionSelecionada" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, static: true }], ngImport: i0, template: "<mat-menu #menu=\"matMenu\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual w-full\">\n <ng-container *ngFor=\"let btn of subItems\">\n <ng-container *ngTemplateOutlet=\"botonTemplate; context:{btn: btn, item: objThis['seleccionados'][nombreColeccion], barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }] });
|
|
869
|
-
}
|
|
870
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, decorators: [{
|
|
871
|
-
type: Component,
|
|
872
|
-
args: [{ selector: 'jvs-tabla-mantenimiento-menu', standalone: true, imports: [
|
|
873
|
-
CommonModule,
|
|
874
|
-
MatMenuModule,
|
|
875
|
-
], template: "<mat-menu #menu=\"matMenu\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual w-full\">\n <ng-container *ngFor=\"let btn of subItems\">\n <ng-container *ngTemplateOutlet=\"botonTemplate; context:{btn: btn, item: objThis['seleccionados'][nombreColeccion], barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</mat-menu>\n" }]
|
|
876
|
-
}], ctorParameters: () => [], propDecorators: { objThis: [{
|
|
877
|
-
type: Input
|
|
878
|
-
}], nombreColeccion: [{
|
|
879
|
-
type: Input
|
|
880
|
-
}], item: [{
|
|
881
|
-
type: Input
|
|
882
|
-
}], derechosActuales: [{
|
|
883
|
-
type: Input
|
|
884
|
-
}], opcionSelecionada: [{
|
|
885
|
-
type: Output
|
|
886
|
-
}], menu: [{
|
|
887
|
-
type: ViewChild,
|
|
888
|
-
args: ['menu', { static: true }]
|
|
889
|
-
}], subItems: [{
|
|
890
|
-
type: Input,
|
|
891
|
-
args: [{ required: true }]
|
|
892
|
-
}], botonTemplate: [{
|
|
893
|
-
type: Input,
|
|
894
|
-
args: [{ required: true }]
|
|
895
|
-
}] } });
|
|
896
|
-
|
|
897
|
-
const getFileName = (name) => {
|
|
898
|
-
const timeSpan = new Date().toISOString();
|
|
899
|
-
const sheetName = name || 'ExportResult';
|
|
900
|
-
const fileName = `${sheetName}-${timeSpan}`;
|
|
901
|
-
return {
|
|
902
|
-
sheetName,
|
|
903
|
-
fileName
|
|
904
|
-
};
|
|
905
|
-
};
|
|
906
|
-
class TableUtil {
|
|
907
|
-
static exportTableToExcelV2(targetTableElm, name) {
|
|
908
|
-
const { sheetName, fileName } = getFileName(name);
|
|
909
|
-
console.log(targetTableElm);
|
|
910
|
-
const wb = XLSX.utils.table_to_book(targetTableElm, {
|
|
911
|
-
sheet: sheetName
|
|
912
|
-
});
|
|
913
|
-
XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
914
|
-
}
|
|
915
|
-
static exportTableToExcel(tableId, name) {
|
|
916
|
-
const { sheetName, fileName } = getFileName(name);
|
|
917
|
-
const targetTableElm = document.getElementById(tableId);
|
|
918
|
-
console.log(targetTableElm);
|
|
919
|
-
const wb = XLSX.utils.table_to_book(targetTableElm, {
|
|
920
|
-
sheet: sheetName
|
|
921
|
-
});
|
|
922
|
-
// XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
923
|
-
}
|
|
924
|
-
static exportArrayToExcel(arr, name) {
|
|
925
|
-
const { sheetName, fileName } = getFileName(name);
|
|
926
|
-
const wb = XLSX.utils.book_new();
|
|
927
|
-
const ws = XLSX.utils.json_to_sheet(arr, { dateNF: 'dd/MM/yyyy' });
|
|
928
|
-
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
|
929
|
-
XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
930
|
-
}
|
|
931
|
-
static getWorkBook(htmlTableId, data) {
|
|
932
|
-
const targetTableElm = document.getElementById(htmlTableId);
|
|
933
|
-
const tableToSheet = XLSX.utils.table_to_sheet(targetTableElm, { raw: true });
|
|
934
|
-
const jsonToSheet = XLSX.utils.json_to_sheet(data);
|
|
935
|
-
const sheetToJson = XLSX.utils.sheet_to_json(tableToSheet);
|
|
936
|
-
return { tableToSheet, jsonToSheet, sheetToJson };
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
class TablaMantenimientoService {
|
|
941
|
-
get templateBotonesComunes() {
|
|
942
|
-
return [
|
|
943
|
-
{ icono: 'roundAdd', tipo: 'nuevo', class: 'text-green-100 !bg-green-600', sinCondicion: true },
|
|
944
|
-
{ icono: 'roundEdit', tipo: 'editar', class: 'text-amber-900 !bg-amber-300' },
|
|
945
|
-
{ icono: 'roundDelete', tipo: 'eliminar', class: 'text-red-100 !bg-red-700' },
|
|
946
|
-
{ icono: 'roundDelete', tipo: 'eliminar_fila', class: 'text-red-100 !bg-red-700' },
|
|
947
|
-
{ icono: 'roundPrint', tipo: 'imprimir', class: '!bg-blue-100 text-blue-700' },
|
|
948
|
-
{ icono: 'roundDownload', tipo: 'descargar', class: '!bg-blue-100 text-blue-700' },
|
|
949
|
-
{ icono: 'roundFolder', tipo: 'ver_archivos', class: '!bg-green-100 text-green-700' },
|
|
950
|
-
{ icono: 'fa5FilePdf', tipo: 'exportar_pdf', label: 'Exportar a PDF', class: 'bg-pdf-light text-pdf' },
|
|
951
|
-
{ icono: 'fa5FileExcel', tipo: 'exportar_excel', label: 'Exportar a Excel', class: 'bg-excel-light text-excel' },
|
|
952
|
-
{ icono: 'fa5sFileExport', tipo: 'exportacion_avanzada', label: 'Exportación Avanzada', class: '!text-indigo-600 !bg-indigo-100' },
|
|
953
|
-
{ icono: 'icSave', tipo: 'guardar', class: '!text-indigo-100 !bg-indigo-600' },
|
|
954
|
-
{ icono: 'icCancel', tipo: 'cancelar', class: '!text-cyan-100 !bg-cyan-600' },
|
|
955
|
-
{
|
|
956
|
-
icono: 'roundFactCheck', tipo: 'seleccionar',
|
|
957
|
-
class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700'
|
|
958
|
-
},
|
|
959
|
-
{ icono: 'roundListAlt', tipo: 'detalle', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
|
|
960
|
-
{ icono: 'roundPublic', tipo: 'ver_mapa', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
|
|
961
|
-
{ icono: 'icCheck', tipo: 'activar', },
|
|
962
|
-
{ icono: 'icClose', tipo: 'desactivar', },
|
|
963
|
-
{ icono: 'fa5sLock', tipo: 'cerrar', },
|
|
964
|
-
{ icono: 'fa5sLockOpen', tipo: 'abrir', },
|
|
965
|
-
];
|
|
966
|
-
}
|
|
967
|
-
get templateColumnasTabla() {
|
|
968
|
-
return [
|
|
969
|
-
{ label: '#', labelLista: 'Numeración', property: 'numeracion_automatica', type: 'numeracion_automatica' },
|
|
970
|
-
];
|
|
971
|
-
}
|
|
972
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
973
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, providedIn: 'root' });
|
|
974
|
-
}
|
|
975
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, decorators: [{
|
|
976
|
-
type: Injectable,
|
|
977
|
-
args: [{
|
|
978
|
-
providedIn: 'root',
|
|
979
|
-
}]
|
|
980
|
-
}] });
|
|
981
|
-
|
|
982
|
-
var TablaMantenimientoComponent_1;
|
|
983
|
-
let TablaMantenimientoComponent = class TablaMantenimientoComponent {
|
|
984
|
-
static { TablaMantenimientoComponent_1 = this; }
|
|
985
|
-
fb;
|
|
986
|
-
overlay;
|
|
987
|
-
viewContainerRef;
|
|
988
|
-
tablaMantenimientoService;
|
|
989
|
-
cdRef;
|
|
990
|
-
static nextId = 0;
|
|
991
|
-
id = `jvs-tabla-mantenimiento-id-${TablaMantenimientoComponent_1.nextId++}`;
|
|
992
|
-
get templateBotonesComunes() {
|
|
993
|
-
return this.tablaMantenimientoService.templateBotonesComunes;
|
|
994
|
-
}
|
|
995
|
-
;
|
|
996
|
-
get templateColumnasTabla() {
|
|
997
|
-
return this.tablaMantenimientoService.templateColumnasTabla;
|
|
998
|
-
}
|
|
999
|
-
;
|
|
1000
|
-
dataSuscription;
|
|
1001
|
-
objThis;
|
|
1002
|
-
nombreColeccion;
|
|
1003
|
-
ctrlBusquedaValue = '';
|
|
1004
|
-
ctrlBusquedaPlaceholder = 'Buscar...';
|
|
1005
|
-
filtroCampos = true;
|
|
1006
|
-
paginador = true;
|
|
1007
|
-
esTabla = true;
|
|
1008
|
-
readOnly = false;
|
|
1009
|
-
filaExtraHeader;
|
|
1010
|
-
filaFooter = false;
|
|
1011
|
-
botonesCRUD = 'CUD';
|
|
1012
|
-
dblclickItem = new EventEmitter();
|
|
1013
|
-
objBotonesCRUD = [
|
|
1014
|
-
{ tipo: 'nuevo', sinCondicion: true },
|
|
1015
|
-
{ tipo: 'editar' },
|
|
1016
|
-
{ tipo: 'eliminar' },
|
|
1017
|
-
];
|
|
1018
|
-
classSeleccionado = ['elemento-seleccionado', /*'!bg-primary-activo','text-primary-contrast', */ 'mat-elevation-z8', /*'dark:!bg-primary-dark-activo',*/ 'border-y-2 border-primary-contrast', 'font-bold', 'text-2xl'];
|
|
1019
|
-
// @Input() classAnulado = ['line-through', 'text-red', 'italic'];
|
|
1020
|
-
classAnulado = ['elemento-anulado', /*'line-through', */ 'text-red-900', 'bg-red-200'];
|
|
1021
|
-
campoAnulado = null;
|
|
1022
|
-
campoAnuladoMensaje = null;
|
|
1023
|
-
opcionSelecionada = new EventEmitter();
|
|
1024
|
-
opcBusqueda = new EventEmitter();
|
|
1025
|
-
accionRecargar = new EventEmitter();
|
|
1026
|
-
set selectionModel(val) {
|
|
1027
|
-
this.objSeleccionado = val;
|
|
1028
|
-
}
|
|
1029
|
-
selectionModelChange = new EventEmitter();
|
|
1030
|
-
isRecargarUsed = false;
|
|
1031
|
-
filaExtraTemplate;
|
|
1032
|
-
paginator;
|
|
1033
|
-
sort;
|
|
1034
|
-
exportarExcel = true;
|
|
1035
|
-
// MIO
|
|
1036
|
-
pageSize = 25;
|
|
1037
|
-
pageSizeOptions = [5, 10, 25, 50, 100, 500, 1000];
|
|
1038
|
-
dataSourceChange = new EventEmitter();
|
|
1039
|
-
resultados = new EventEmitter();
|
|
1040
|
-
dataSource = new MatTableDataSource(); // or whatever type of datasource you have
|
|
1041
|
-
// this is where the magic happens:
|
|
1042
|
-
table;
|
|
1043
|
-
columnDefs;
|
|
1044
|
-
componenteCargadoTotalmente = false;
|
|
1045
|
-
/////////////////////
|
|
1046
|
-
paginacion = {
|
|
1047
|
-
pageSize: 25,
|
|
1048
|
-
pageSizeOptions: [],
|
|
1049
|
-
pageCurrent: null,
|
|
1050
|
-
pageIndex: 0,
|
|
1051
|
-
pageLength: null,
|
|
1052
|
-
};
|
|
1053
|
-
// All that's left is to add them to the table ourselves:
|
|
1054
|
-
ignorarDerechos = false;
|
|
1055
|
-
derechosActuales = null;
|
|
1056
|
-
// listaCRUD: BotonMantenimiento[] = [];
|
|
1057
|
-
rows;
|
|
1058
|
-
rowFooter;
|
|
1059
|
-
mouseEvent$;
|
|
1060
|
-
overlayRef;
|
|
1061
|
-
userMenu;
|
|
1062
|
-
// FILTRO BUSQUEDA
|
|
1063
|
-
opcFiltroActual = {};
|
|
1064
|
-
capitalizarTexto = capitalizarTexto;
|
|
1065
|
-
_seleccionado = {};
|
|
1066
|
-
cCampoBusqueda = new FormControl('');
|
|
1067
|
-
chkLista = new DataModel();
|
|
1068
|
-
constructor(fb, overlay, viewContainerRef, tablaMantenimientoService, cdRef) {
|
|
1069
|
-
this.fb = fb;
|
|
1070
|
-
this.overlay = overlay;
|
|
1071
|
-
this.viewContainerRef = viewContainerRef;
|
|
1072
|
-
this.tablaMantenimientoService = tablaMantenimientoService;
|
|
1073
|
-
this.cdRef = cdRef;
|
|
1074
|
-
// this._seleccionado[this.nombreColeccion] = null;
|
|
1075
|
-
}
|
|
1076
|
-
_ctrlBusqueda = '';
|
|
1077
|
-
get ctrlBusqueda() {
|
|
1078
|
-
return this._ctrlBusqueda;
|
|
1079
|
-
}
|
|
1080
|
-
set ctrlBusqueda(val) {
|
|
1081
|
-
if (val == '') {
|
|
1082
|
-
val = 'simple';
|
|
1083
|
-
}
|
|
1084
|
-
this._ctrlBusqueda = val;
|
|
1085
|
-
}
|
|
1086
|
-
// @Input() leyenda;
|
|
1087
|
-
_leyenda = undefined;
|
|
1088
|
-
get leyenda() {
|
|
1089
|
-
return this._leyenda;
|
|
1090
|
-
}
|
|
1091
|
-
set leyenda(val) {
|
|
1092
|
-
if (typeof val == 'string') {
|
|
1093
|
-
this._leyenda = { text: val };
|
|
1094
|
-
}
|
|
1095
|
-
else {
|
|
1096
|
-
this._leyenda = val;
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
// @Input() idTabla: string[];
|
|
1100
|
-
_idTabla = [];
|
|
1101
|
-
get idTabla() {
|
|
1102
|
-
return this._idTabla;
|
|
1103
|
-
}
|
|
1104
|
-
set idTabla(val) {
|
|
1105
|
-
if (Array.isArray(val)) {
|
|
1106
|
-
this._idTabla = val;
|
|
1107
|
-
}
|
|
1108
|
-
else {
|
|
1109
|
-
this._idTabla.push(val);
|
|
1110
|
-
}
|
|
1111
|
-
}
|
|
1112
|
-
_columnasTabla = [];
|
|
1113
|
-
get columnasTabla() {
|
|
1114
|
-
return this._columnasTabla ?? [];
|
|
1115
|
-
}
|
|
1116
|
-
set columnasTabla(val) {
|
|
1117
|
-
const reemplazarConTemplate = (listaInicial = []) => {
|
|
1118
|
-
listaInicial.forEach((btnActual, idx) => {
|
|
1119
|
-
const btnEnTemplate = buscarEnArray(this.templateColumnasTabla, 'property', btnActual.property);
|
|
1120
|
-
if (btnEnTemplate) {
|
|
1121
|
-
listaInicial[idx] = {
|
|
1122
|
-
...btnEnTemplate,
|
|
1123
|
-
...btnActual
|
|
1124
|
-
};
|
|
1125
|
-
}
|
|
1126
|
-
if (listaInicial[idx].type == 'text') {
|
|
1127
|
-
if (!listaInicial[idx].text) {
|
|
1128
|
-
listaInicial[idx].text = {
|
|
1129
|
-
cssStyle: {}
|
|
1130
|
-
};
|
|
1131
|
-
}
|
|
1132
|
-
else if (!listaInicial[idx].text.cssStyle) {
|
|
1133
|
-
listaInicial[idx].text.cssStyle = {};
|
|
1134
|
-
}
|
|
1135
|
-
listaInicial[idx].text.cssStyle = { ...listaInicial[idx].text.cssStyle };
|
|
1136
|
-
}
|
|
1137
|
-
else if (listaInicial[idx].type == 'estado') {
|
|
1138
|
-
const mutar = {
|
|
1139
|
-
...listaInicial[idx],
|
|
1140
|
-
type: 'icons',
|
|
1141
|
-
iconsDef: {
|
|
1142
|
-
soloIcono: true,
|
|
1143
|
-
iconSize: '16px',
|
|
1144
|
-
items: [
|
|
1145
|
-
// {
|
|
1146
|
-
// icon: 'roundToggleOff', contentCss: 'text-gray-400',
|
|
1147
|
-
// esVisible: (row) => row['iCredDepenTareaEstado'] == 0
|
|
1148
|
-
// },
|
|
1149
|
-
// {
|
|
1150
|
-
// icon: 'roundToggleOn', contentCss: 'text-green-600',
|
|
1151
|
-
// esVisible: (row) => row['iCredDepenTareaEstado'] == 1
|
|
1152
|
-
// },
|
|
1153
|
-
]
|
|
1154
|
-
},
|
|
1155
|
-
};
|
|
1156
|
-
if (listaInicial[idx].estados) {
|
|
1157
|
-
listaInicial[idx].estados.forEach((estado) => {
|
|
1158
|
-
if (Array.isArray(mutar.iconsDef.items)) {
|
|
1159
|
-
mutar.iconsDef.items.push({
|
|
1160
|
-
icon: estado.icon, contentCss: estado.cssClasses,
|
|
1161
|
-
esVisible: (row) => row[listaInicial[idx].property] == estado.estado,
|
|
1162
|
-
});
|
|
1163
|
-
}
|
|
1164
|
-
});
|
|
1165
|
-
}
|
|
1166
|
-
listaInicial[idx] = mutar;
|
|
1167
|
-
}
|
|
1168
|
-
if (btnActual.type == 'custom') {
|
|
1169
|
-
listaInicial[idx].datosExtra = {
|
|
1170
|
-
...listaInicial[idx].datosExtra,
|
|
1171
|
-
tabla_mantenimiento_config_visibleAlias: listaInicial[idx].visible == undefined ? true : listaInicial[idx].visible,
|
|
1172
|
-
};
|
|
1173
|
-
listaInicial[idx].visible = false;
|
|
1174
|
-
}
|
|
1175
|
-
});
|
|
1176
|
-
return listaInicial;
|
|
1177
|
-
};
|
|
1178
|
-
this._columnasTabla = val ? reemplazarConTemplate(val) : [];
|
|
1179
|
-
}
|
|
1180
|
-
// @Input() botonesMenu: BotonMantenimiento[] = [];
|
|
1181
|
-
_botonesMenu = {
|
|
1182
|
-
crud: undefined,
|
|
1183
|
-
principal: [],
|
|
1184
|
-
izquierda: [],
|
|
1185
|
-
derecha: [],
|
|
1186
|
-
secundario: [],
|
|
1187
|
-
inferior: [],
|
|
1188
|
-
};
|
|
1189
|
-
get botonesMenu() {
|
|
1190
|
-
return this._botonesMenu;
|
|
1191
|
-
}
|
|
1192
|
-
get botonesMenuFinal() {
|
|
1193
|
-
const nuevoBotonesMenu = this.botonesMenu;
|
|
1194
|
-
// Iteramos sobre cada sección de botones
|
|
1195
|
-
Object.keys(nuevoBotonesMenu).forEach(seccion => {
|
|
1196
|
-
nuevoBotonesMenu[seccion] = nuevoBotonesMenu[seccion]?.filter((boton) => {
|
|
1197
|
-
if (this.readOnly) {
|
|
1198
|
-
if (boton.subItems) {
|
|
1199
|
-
boton.subItems = boton.subItems.filter((subItem) => subItem.ignorarReadOnly === true);
|
|
1200
|
-
return boton.subItems.length < 1;
|
|
1201
|
-
}
|
|
1202
|
-
return boton.ignorarReadOnly === true;
|
|
1203
|
-
}
|
|
1204
|
-
return true;
|
|
1205
|
-
}); // Filtramos los botones nulos
|
|
1206
|
-
});
|
|
1207
|
-
return nuevoBotonesMenu;
|
|
1208
|
-
}
|
|
1209
|
-
set botonesMenu(val) {
|
|
1210
|
-
const reemplazarConTemplate = (listaInicial = []) => listaInicial.map((btnActual) => {
|
|
1211
|
-
const btnEnTemplate = buscarEnArray(this.templateBotonesComunes, 'tipo', btnActual.tipoTemplate ?? btnActual.tipo);
|
|
1212
|
-
if (btnEnTemplate) {
|
|
1213
|
-
if (btnActual.tipoTemplate && !btnActual.label) {
|
|
1214
|
-
btnEnTemplate.label = undefined;
|
|
1215
|
-
}
|
|
1216
|
-
if (btnActual.subItems) {
|
|
1217
|
-
return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion, subItems: reemplazarConTemplate(btnActual.subItems) };
|
|
1218
|
-
}
|
|
1219
|
-
return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion };
|
|
1220
|
-
}
|
|
1221
|
-
return btnActual;
|
|
1222
|
-
});
|
|
1223
|
-
if (val?.crud) {
|
|
1224
|
-
this.objBotonesCRUD = this.templateBotonesComunes
|
|
1225
|
-
.filter(obj => ['nuevo', 'editar', 'eliminar'].includes(obj.tipo))
|
|
1226
|
-
.map(obj => val.crud?.find(o => o.tipo === obj.tipo) ?? obj);
|
|
1227
|
-
}
|
|
1228
|
-
Object.keys(val).forEach(btnKey => {
|
|
1229
|
-
if (val[btnKey]) {
|
|
1230
|
-
val[btnKey] = reemplazarConTemplate(val[btnKey]);
|
|
1231
|
-
}
|
|
1232
|
-
});
|
|
1233
|
-
this._botonesMenu = { ...this._botonesMenu, ...val };
|
|
1234
|
-
}
|
|
1235
|
-
get listaMenuCompleto() {
|
|
1236
|
-
let menuTotal = [];
|
|
1237
|
-
menuTotal = menuTotal.concat(this.botonesMenu.izquierda ?? []);
|
|
1238
|
-
menuTotal = menuTotal.concat(this.botonesMenu.crud ?? []);
|
|
1239
|
-
menuTotal = menuTotal.concat(this.botonesMenu.principal ?? []);
|
|
1240
|
-
menuTotal = menuTotal.concat(this.botonesMenu.derecha ?? []);
|
|
1241
|
-
menuTotal = menuTotal.concat(this.botonesMenu.secundario ?? []);
|
|
1242
|
-
menuTotal = menuTotal.concat(this.botonesMenu.inferior ?? []);
|
|
1243
|
-
return menuTotal;
|
|
1244
|
-
}
|
|
1245
|
-
get objVisibleColumns() {
|
|
1246
|
-
return this.columnasTabla.filter(column => {
|
|
1247
|
-
if (column.noMostrar != undefined) {
|
|
1248
|
-
column.noMostrarEnLista = column.noMostrar;
|
|
1249
|
-
}
|
|
1250
|
-
return !tipoValorFuncion(column.noMostrarEnLista, false);
|
|
1251
|
-
}).filter(column => {
|
|
1252
|
-
// SECCION MODIFICADOR
|
|
1253
|
-
if (this.filaExtraTemplate) {
|
|
1254
|
-
column.sort = false;
|
|
1255
|
-
}
|
|
1256
|
-
// Fin SECCION MODIFICADOR
|
|
1257
|
-
column.visible = tipoValorFuncion(column.visible, true);
|
|
1258
|
-
if (!column.visible && column.esVisible != undefined) {
|
|
1259
|
-
column.visible = column.esVisible();
|
|
1260
|
-
}
|
|
1261
|
-
return column.visible;
|
|
1262
|
-
});
|
|
1263
|
-
}
|
|
1264
|
-
get visibleColumns() {
|
|
1265
|
-
return this.objVisibleColumns.map(column => column.property);
|
|
1266
|
-
}
|
|
1267
|
-
get tieneCheckbox() {
|
|
1268
|
-
return this.columnasTabla && this.columnasTabla.length > 0 && this.columnasTabla.find(col => col.type === 'checkbox') || false;
|
|
1269
|
-
}
|
|
1270
|
-
get buscarItemSeleccionado() {
|
|
1271
|
-
const dRet = this.dataSource.data.find(itm => this._seleccionado === this.propiedadSeleccion(itm));
|
|
1272
|
-
return dRet ?? null;
|
|
1273
|
-
}
|
|
1274
|
-
get objSeleccionado() {
|
|
1275
|
-
return this.buscarItemSeleccionado; // ?? this.objThis?.['seleccionados']?.[this.nombreColeccion];
|
|
1276
|
-
}
|
|
1277
|
-
set objSeleccionado(val) {
|
|
1278
|
-
// if (val) {
|
|
1279
|
-
this.seleccionarItem(val, true);
|
|
1280
|
-
// }
|
|
1281
|
-
/* if (!this.objThis) {
|
|
1282
|
-
this.objThis = {};
|
|
1283
|
-
}
|
|
1284
|
-
if (!this.objThis['seleccionados']) {
|
|
1285
|
-
this.objThis['seleccionados'] = {};
|
|
1286
|
-
}
|
|
1287
|
-
this.objThis['seleccionados'][this.nombreColeccion] = val;*/
|
|
1288
|
-
}
|
|
1289
|
-
get idsSeleccionado() {
|
|
1290
|
-
return this.chkLista.generarLista();
|
|
1291
|
-
}
|
|
1292
|
-
idTablaValor(data) {
|
|
1293
|
-
if (data) {
|
|
1294
|
-
if (this.idTabla.length < 1) {
|
|
1295
|
-
return shortHash(JSON.stringify({ data, claseFinal: undefined }));
|
|
1296
|
-
}
|
|
1297
|
-
return this.idTabla.map(d => data[d]).join('-');
|
|
1298
|
-
}
|
|
1299
|
-
return '';
|
|
1300
|
-
}
|
|
1301
|
-
condicionesClaseFila = (item) => [];
|
|
1302
|
-
rowTooltip = (item) => '';
|
|
1303
|
-
soloIconos = false;
|
|
1304
|
-
ngOnInit() {
|
|
1305
|
-
// this.sharedService.dataRutaActual$.pipe(untilDestroyed(this)).subscribe(datRouteData => {
|
|
1306
|
-
// if (datRouteData) {
|
|
1307
|
-
// this.derechosActuales = datRouteData['derechos'];
|
|
1308
|
-
// if (!this.ignorarDerechos) {
|
|
1309
|
-
// this.ignorarDerechos = datRouteData['ignorarDerechos'] ?? false;
|
|
1310
|
-
// }
|
|
1311
|
-
// }
|
|
1312
|
-
// });
|
|
1313
|
-
this.paginacion.pageSize = this.pageSize;
|
|
1314
|
-
this.paginacion.pageSizeOptions = this.pageSizeOptions;
|
|
1315
|
-
this.actualizarCrud();
|
|
1316
|
-
this.agregarBotonesExportacion();
|
|
1317
|
-
if (this.dataSuscription) {
|
|
1318
|
-
this.dataSuscription.subscribe(res => {
|
|
1319
|
-
if (res) {
|
|
1320
|
-
if (this.objSeleccionado) {
|
|
1321
|
-
console.log('SELECCIONADO');
|
|
1322
|
-
if (this.idTabla && this.idTabla.length > 0) {
|
|
1323
|
-
console.log('ID TABLA');
|
|
1324
|
-
const arrayData = this.idTabla.map(d => this.objSeleccionado[d]);
|
|
1325
|
-
console.log(arrayData);
|
|
1326
|
-
const busqueda = buscarEnArray(res, this.idTabla, arrayData);
|
|
1327
|
-
console.log(busqueda);
|
|
1328
|
-
if (busqueda) {
|
|
1329
|
-
console.log(busqueda);
|
|
1330
|
-
this.objSeleccionado = busqueda;
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
else {
|
|
1334
|
-
console.log('eLSE ID TABLA');
|
|
1335
|
-
const dataStr = res.find((itm) => shortHash(JSON.stringify({
|
|
1336
|
-
...itm, claseFinal: undefined
|
|
1337
|
-
})) == shortHash(JSON.stringify({ ...this.objSeleccionado, claseFinal: undefined })));
|
|
1338
|
-
if (dataStr) {
|
|
1339
|
-
this.objSeleccionado = dataStr;
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
this.setData(res);
|
|
1344
|
-
}
|
|
1345
|
-
});
|
|
1346
|
-
}
|
|
1347
|
-
this.isRecargarUsed = this.accionRecargar.observed;
|
|
1348
|
-
}
|
|
1349
|
-
ngAfterContentInit() {
|
|
1350
|
-
this.componenteCargadoTotalmente = true;
|
|
1351
|
-
this.cdRef.detectChanges();
|
|
1352
|
-
this.columnDefs.forEach(columnDef => {
|
|
1353
|
-
this.table.addColumnDef(columnDef);
|
|
1354
|
-
const col = this.columnasTabla.find(col => col.property == columnDef.name);
|
|
1355
|
-
if (col && col.type == 'custom') {
|
|
1356
|
-
console.warn(JSON.stringify(col));
|
|
1357
|
-
col.visible = col.datosExtra?.tabla_mantenimiento_config_visibleAlias ?? col.visible;
|
|
1358
|
-
delete col.datosExtra?.tabla_mantenimiento_config_visibleAlias;
|
|
1359
|
-
if (Object.keys(col.datosExtra).length < 1) {
|
|
1360
|
-
delete col.datosExtra;
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
});
|
|
1364
|
-
// console.log(a);
|
|
1365
|
-
if (this.ctrlBusquedaValue) {
|
|
1366
|
-
this.cCampoBusqueda.setValue(this.ctrlBusquedaValue);
|
|
1367
|
-
}
|
|
1368
|
-
this.table.renderRows(); // 🔹 Refrescar la tabla
|
|
1369
|
-
}
|
|
1370
|
-
ngOnChanges(changes) {
|
|
1371
|
-
console.warn(changes);
|
|
1372
|
-
if (changes['botonesCRUD'] || changes['ctrlBusqueda']) {
|
|
1373
|
-
this.actualizarCrud();
|
|
1374
|
-
}
|
|
1375
|
-
if (changes['botonesMenu']) {
|
|
1376
|
-
this.agregarBotonesExportacion();
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
trackByFn = (index, item) => {
|
|
1380
|
-
return this.propiedadSeleccion(item);
|
|
1381
|
-
};
|
|
1382
|
-
agregarBotonesExportacion() {
|
|
1383
|
-
const fnAddBoton = (condicion, tipoBoton) => {
|
|
1384
|
-
if (condicion) {
|
|
1385
|
-
const objBoton = buscarEnArray(this.templateBotonesComunes, 'tipo', tipoBoton);
|
|
1386
|
-
const objBotonEnInferior = buscarEnArray((this.botonesMenu?.inferior ?? []), 'tipo', tipoBoton);
|
|
1387
|
-
if (!objBotonEnInferior && objBoton) {
|
|
1388
|
-
if (!this.botonesMenu.inferior) {
|
|
1389
|
-
this.botonesMenu.inferior = [];
|
|
1390
|
-
}
|
|
1391
|
-
this.botonesMenu?.inferior?.push({
|
|
1392
|
-
...objBoton,
|
|
1393
|
-
esIndependiente: true,
|
|
1394
|
-
});
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
};
|
|
1398
|
-
fnAddBoton((this.exportarExcel && this.esTabla), 'exportar_excel');
|
|
1399
|
-
}
|
|
1400
|
-
actualizarCrud() {
|
|
1401
|
-
const operacionesCRUD = {
|
|
1402
|
-
'C': 'nuevo',
|
|
1403
|
-
'U': 'editar',
|
|
1404
|
-
'D': 'eliminar'
|
|
1405
|
-
};
|
|
1406
|
-
const agregarBoton = (tipo) => {
|
|
1407
|
-
let botonComun = buscarEnArray(this.templateBotonesComunes, 'tipo', tipo);
|
|
1408
|
-
if (botonComun) {
|
|
1409
|
-
const personalizado = buscarEnArray(this.objBotonesCRUD, 'tipo', tipo);
|
|
1410
|
-
const boton = personalizado ? { ...botonComun, ...personalizado } : botonComun;
|
|
1411
|
-
if (this.botonesMenu.crud) {
|
|
1412
|
-
this.botonesMenu.crud.push(boton);
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
};
|
|
1416
|
-
const lstCRUD = (this.botonesMenu.crud ?? []).map(i => i.tipo);
|
|
1417
|
-
if (lstCRUD.length > 0) {
|
|
1418
|
-
for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
|
|
1419
|
-
const operacionKey = operacion;
|
|
1420
|
-
if (lstCRUD.includes(operacion) && operacionesCRUD[operacionKey]) {
|
|
1421
|
-
agregarBoton(operacionesCRUD[operacionKey]);
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
else {
|
|
1426
|
-
this.botonesMenu.crud = [];
|
|
1427
|
-
for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
|
|
1428
|
-
const operacionKey = operacion;
|
|
1429
|
-
if (operacionesCRUD[operacionKey]) {
|
|
1430
|
-
agregarBoton(operacionesCRUD[operacionKey]);
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
}
|
|
1434
|
-
if (this.ctrlBusqueda === 'simple') {
|
|
1435
|
-
this.cCampoBusqueda.valueChanges.pipe(untilDestroyed(this)).subscribe(value => this.onFilterChange(value ?? ''));
|
|
1436
|
-
}
|
|
1437
|
-
if (this.botonesCRUD === '-') {
|
|
1438
|
-
this.botonesMenu.crud = [];
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
|
-
classFila(item) {
|
|
1442
|
-
let claseFinal = [];
|
|
1443
|
-
if (this.campoAnulado && (item[this.campoAnulado] == 1)) {
|
|
1444
|
-
claseFinal = claseFinal.concat(this.classAnulado);
|
|
1445
|
-
}
|
|
1446
|
-
if (this.objSeleccionado == item || this.esSeleccionActual(item)) {
|
|
1447
|
-
claseFinal = claseFinal.concat(this.classSeleccionado);
|
|
1448
|
-
}
|
|
1449
|
-
claseFinal = claseFinal.concat(this.condicionesClaseFila(item));
|
|
1450
|
-
item.claseFinal = claseFinal;
|
|
1451
|
-
return claseFinal;
|
|
1452
|
-
}
|
|
1453
|
-
procesarRowTooltip(item) {
|
|
1454
|
-
let txtTooptip = [];
|
|
1455
|
-
if (this.campoAnuladoMensaje && (item[this.campoAnulado] == 1)) {
|
|
1456
|
-
txtTooptip.push(item[this.campoAnuladoMensaje]);
|
|
1457
|
-
// return item[this.campoAnuladoMensaje];
|
|
1458
|
-
}
|
|
1459
|
-
if (this.rowTooltip) {
|
|
1460
|
-
txtTooptip.push(this.rowTooltip(item));
|
|
1461
|
-
}
|
|
1462
|
-
return txtTooptip.filter(itm => !!itm).join(' | ');
|
|
1463
|
-
}
|
|
1464
|
-
subItemsActivos(btn, item) {
|
|
1465
|
-
return btn.subItems.filter((sub) => !sub.esVisible || sub.esVisible(item)).length > 0;
|
|
1466
|
-
}
|
|
1467
|
-
get noData() {
|
|
1468
|
-
if (!this.esTabla) {
|
|
1469
|
-
return of(true);
|
|
1470
|
-
}
|
|
1471
|
-
if (!this.dataSource || !this.table) {
|
|
1472
|
-
return of(true);
|
|
1473
|
-
}
|
|
1474
|
-
// @ts-ignore
|
|
1475
|
-
return this.table.dataSource?.connect().pipe(map(data => data?.length === 0));
|
|
1476
|
-
}
|
|
1477
|
-
onFilterChange(value) {
|
|
1478
|
-
if (!this.dataSource) {
|
|
1479
|
-
return;
|
|
1480
|
-
}
|
|
1481
|
-
value = value.trim();
|
|
1482
|
-
value = value.toLowerCase();
|
|
1483
|
-
this.dataSource.filter = value;
|
|
1484
|
-
}
|
|
1485
|
-
toggleColumnVisibility(column, event) {
|
|
1486
|
-
event.stopPropagation();
|
|
1487
|
-
event.stopImmediatePropagation();
|
|
1488
|
-
column.visible = !column.visible;
|
|
1489
|
-
}
|
|
1490
|
-
cargarData(retorno = false) {
|
|
1491
|
-
if (this.ctrlBusqueda && this.ctrlBusqueda == 'simple') {
|
|
1492
|
-
if (!retorno) {
|
|
1493
|
-
this.dataSource.paginator = this.paginator;
|
|
1494
|
-
this.dataSource.sort = this.sort;
|
|
1495
|
-
}
|
|
1496
|
-
const aS = this.dataSource?.data;
|
|
1497
|
-
if ((!aS || !aS[0] || !aS[0]['iTotalRegistros'])) {
|
|
1498
|
-
return false;
|
|
1499
|
-
}
|
|
1500
|
-
}
|
|
1501
|
-
const dPag = {
|
|
1502
|
-
iPaginacion: 1,
|
|
1503
|
-
iPageSize: this.paginator?.pageSize ? this.paginator?.pageSize : this.paginacion.pageCurrent?.pageSize,
|
|
1504
|
-
iPageNumber: (this.paginator?.pageIndex ? this.paginator?.pageIndex : 0) + 1,
|
|
1505
|
-
};
|
|
1506
|
-
if (this.ctrlBusqueda && this.ctrlBusqueda == 'query') {
|
|
1507
|
-
dPag['cCampoBusqueda'] = this.cCampoBusqueda.value;
|
|
1508
|
-
}
|
|
1509
|
-
if (retorno) {
|
|
1510
|
-
return dPag;
|
|
1511
|
-
}
|
|
1512
|
-
this.resultados.emit(dPag);
|
|
1513
|
-
this.opcBusqueda.emit(dPag);
|
|
1514
|
-
}
|
|
1515
|
-
// FIN FILTRO BUSQUEDA INTEGRAR
|
|
1516
|
-
setData(data) {
|
|
1517
|
-
this.dataSource = new MatTableDataSource(data);
|
|
1518
|
-
this.dataSource.sortingDataAccessor = (item, property) => {
|
|
1519
|
-
const dColumn = buscarEnArray(this.columnasTabla, 'property', property);
|
|
1520
|
-
if (dColumn) {
|
|
1521
|
-
switch (dColumn.sortType ?? dColumn.type) {
|
|
1522
|
-
case 'number':
|
|
1523
|
-
return item[property] * 1;
|
|
1524
|
-
case 'date':
|
|
1525
|
-
return formatearFecha(item[property]);
|
|
1526
|
-
}
|
|
1527
|
-
}
|
|
1528
|
-
if (item) {
|
|
1529
|
-
switch (property) {
|
|
1530
|
-
case 'fromDate':
|
|
1531
|
-
return new Date(item['fromDate']);
|
|
1532
|
-
default:
|
|
1533
|
-
return item[property];
|
|
1534
|
-
}
|
|
1535
|
-
}
|
|
1536
|
-
};
|
|
1537
|
-
// this.paginator.length = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
|
|
1538
|
-
// this.dataSource.paginator = this.paginator;
|
|
1539
|
-
if (this.sort) {
|
|
1540
|
-
this.dataSource.sort = this.sort;
|
|
1541
|
-
}
|
|
1542
|
-
// this.dataSource.filter = this.filter;
|
|
1543
|
-
this.dataSourceChange.emit(this.dataSource);
|
|
1544
|
-
// this.dataSource.paginator.pageSize = this.paginacion.pageSize;
|
|
1545
|
-
if (data && data[0] && data[0]['iPageNumber']) {
|
|
1546
|
-
this.paginacion.pageIndex = (data && data[0] && data[0]['iPageNumber']) ? data[0]['iPageNumber'] : 0;
|
|
1547
|
-
}
|
|
1548
|
-
this.paginacion.pageLength = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
|
|
1549
|
-
if (data && data[0] && !data[0]['iTotalRegistros']) {
|
|
1550
|
-
this.dataSource.paginator = this.paginator;
|
|
1551
|
-
}
|
|
1552
|
-
if (this.tieneCheckbox) {
|
|
1553
|
-
this.chkLista.agregarControles(data, this.tieneCheckbox.property, !this.tieneCheckbox.chkFieldPersistente, (this.tieneCheckbox.chkField ?? null), this.tieneCheckbox.chkFieldSeparador);
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
botonDisabled(btn, item) {
|
|
1557
|
-
let disabled;
|
|
1558
|
-
if (!btn.sinCondicion) {
|
|
1559
|
-
if (btn.estaDeshabilitado) {
|
|
1560
|
-
disabled = btn.estaDeshabilitado(item, this);
|
|
1561
|
-
}
|
|
1562
|
-
else {
|
|
1563
|
-
disabled = !this.objSeleccionado;
|
|
1564
|
-
}
|
|
1565
|
-
}
|
|
1566
|
-
if (!disabled && !btn.esIndependiente && !btn.ignorarDerecho && this.derechosActuales) {
|
|
1567
|
-
// if (!this.usuarioService.esEquipoJVSoft()) {
|
|
1568
|
-
disabled = !(this.derechosActuales[btn.cDerechoCodigo ?? btn.tipo]);
|
|
1569
|
-
// }
|
|
1570
|
-
}
|
|
1571
|
-
return disabled;
|
|
1572
|
-
}
|
|
1573
|
-
propiedadSeleccion(item) {
|
|
1574
|
-
return `${this.nombreColeccion}_${this.idTablaValor(item)}`;
|
|
1575
|
-
}
|
|
1576
|
-
esSeleccionActual(item) {
|
|
1577
|
-
return this._seleccionado === this.propiedadSeleccion(item);
|
|
1578
|
-
}
|
|
1579
|
-
seleccionarItem(item, forzado = false) {
|
|
1580
|
-
const idItem = this.propiedadSeleccion(item);
|
|
1581
|
-
console.log(this._seleccionado, idItem);
|
|
1582
|
-
if (forzado) {
|
|
1583
|
-
this._seleccionado = idItem;
|
|
1584
|
-
}
|
|
1585
|
-
else {
|
|
1586
|
-
this._seleccionado = this._seleccionado === idItem ? null : idItem;
|
|
1587
|
-
}
|
|
1588
|
-
this.selectionModelChange.emit(this.objSeleccionado);
|
|
1589
|
-
/*if (!this.objThis) {
|
|
1590
|
-
this.objThis = {};
|
|
1591
|
-
}
|
|
1592
|
-
if (!this.objThis['seleccionados']) {
|
|
1593
|
-
this.objThis['seleccionados'] = {};
|
|
1594
|
-
}
|
|
1595
|
-
this.objThis['seleccionados'][this.nombreColeccion] = this._seleccionado;*/
|
|
1596
|
-
}
|
|
1597
|
-
opcMenu(item, objMenu, modal = null, retorno = false) {
|
|
1598
|
-
console.log(this.buscarItemSeleccionado);
|
|
1599
|
-
console.log(objMenu);
|
|
1600
|
-
// let salir = this.readOnly;
|
|
1601
|
-
// if (salir && this.readOnly === 'permitirSeleccion' && ['ver', 'seleccionar'].includes(objMenu.tipo)) {
|
|
1602
|
-
// salir = false;
|
|
1603
|
-
// }
|
|
1604
|
-
// if (salir) {
|
|
1605
|
-
// return false;
|
|
1606
|
-
// }
|
|
1607
|
-
// console.warn(objMenu);
|
|
1608
|
-
if (objMenu.tipo == 'exportar_excel' && this.exportarExcel) {
|
|
1609
|
-
/*
|
|
1610
|
-
TableUtil.exportArrayToExcel(this.dataSource.data.map(x => {
|
|
1611
|
-
const columnasNumeros = this.objVisibleColumns.filter(column => ['money', 'number'].includes(column.type));
|
|
1612
|
-
columnasNumeros.forEach(columna => {
|
|
1613
|
-
x[columna.property] *= 1;
|
|
1614
|
-
});
|
|
1615
|
-
return x;
|
|
1616
|
-
}), 'TEST');
|
|
1617
|
-
*/
|
|
1618
|
-
const dataGeneradoPorHtml = TableUtil.getWorkBook('tabla_' + this.nombreColeccion, []);
|
|
1619
|
-
const objetosExtraidos = this.dataSource.filteredData.map((objeto, idx) => this.objVisibleColumns.reduce((acumulador, columna) => {
|
|
1620
|
-
// console.log(propiedad);
|
|
1621
|
-
const nColumn = (columna.labelLista ?? columna.label).toUpperCase().replace('<BR>', ' ');
|
|
1622
|
-
switch (columna.type) {
|
|
1623
|
-
case 'date':
|
|
1624
|
-
// acumulador[nColumn] = (new DatePipe('es-PE')).transform(objeto[columna.property], 'dd/MM/yyyy' /*'yyyy-MM-dd'*/);
|
|
1625
|
-
// new Date(dateString.replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
|
|
1626
|
-
// acumulador[nColumn] = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
|
|
1627
|
-
// acumulador[nColumn] = formatearFechaFormato(objeto[columna.property], 'dd/MM/yyyy');
|
|
1628
|
-
// acumulador[nColumn] = formatearFechaTimezone(objeto[columna.property]);
|
|
1629
|
-
// acumulador[nColumn] = new Date(objeto[columna.property]);
|
|
1630
|
-
let fecha = objeto[columna.property];
|
|
1631
|
-
if (objeto[columna.property]) {
|
|
1632
|
-
fecha = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
|
|
1633
|
-
if (getBrowserName() == 'chrome') {
|
|
1634
|
-
fecha = moment(objeto[columna.property], true).add(2, 'minutes').toDate();
|
|
1635
|
-
}
|
|
1636
|
-
}
|
|
1637
|
-
acumulador[nColumn] = fecha;
|
|
1638
|
-
// acumulador[nColumn] = objeto[columna.property];
|
|
1639
|
-
break;
|
|
1640
|
-
case 'number':
|
|
1641
|
-
case 'money':
|
|
1642
|
-
acumulador[nColumn] = objeto[columna.property] * 1;
|
|
1643
|
-
break;
|
|
1644
|
-
default:
|
|
1645
|
-
if (columna.property == 'numeracion_automatica') {
|
|
1646
|
-
acumulador[nColumn] = idx + 1;
|
|
1647
|
-
}
|
|
1648
|
-
else {
|
|
1649
|
-
if (columna.type == 'custom') {
|
|
1650
|
-
// dataGeneradoPorHtml.sheetToJson
|
|
1651
|
-
acumulador[nColumn] = dataGeneradoPorHtml.sheetToJson[idx][columna.label];
|
|
1652
|
-
}
|
|
1653
|
-
else {
|
|
1654
|
-
if (columna.type == 'text' && columna.innerHTML) {
|
|
1655
|
-
const convertirHtmlATexto = (html) => {
|
|
1656
|
-
const elementoTemporal = document.createElement('div');
|
|
1657
|
-
elementoTemporal.innerHTML = html;
|
|
1658
|
-
return elementoTemporal.textContent || "";
|
|
1659
|
-
};
|
|
1660
|
-
acumulador[nColumn] = convertirHtmlATexto(columna.innerHTML(objeto));
|
|
1661
|
-
}
|
|
1662
|
-
else if (columna.transformar) {
|
|
1663
|
-
acumulador[nColumn] = columna.transformar(objeto);
|
|
1664
|
-
}
|
|
1665
|
-
else {
|
|
1666
|
-
acumulador[nColumn] = objeto[columna.property];
|
|
1667
|
-
}
|
|
1668
|
-
}
|
|
1669
|
-
}
|
|
1670
|
-
break;
|
|
1671
|
-
}
|
|
1672
|
-
return acumulador;
|
|
1673
|
-
}, {}));
|
|
1674
|
-
// TableUtil.exportTableToExcel('tabla_' + this.nombreColeccion);
|
|
1675
|
-
// console.log(objetosExtraidos);
|
|
1676
|
-
TableUtil.exportArrayToExcel(objetosExtraidos, this.nombreColeccion);
|
|
1677
|
-
// this.tableExporter.exportTable('xlsx', {fileName: 'JVSoftExport'});
|
|
1678
|
-
}
|
|
1679
|
-
const opAdic = { seccion: this.nombreColeccion };
|
|
1680
|
-
if (item) {
|
|
1681
|
-
opAdic['item'] = item;
|
|
1682
|
-
}
|
|
1683
|
-
opAdic['itemSeleccionado'] = this.objSeleccionado;
|
|
1684
|
-
if (this.tieneCheckbox) {
|
|
1685
|
-
// itmsSeleccionados = this.formulariosGlobalesService.generarLista(this.nombreColeccion);
|
|
1686
|
-
opAdic['idsSeleccionados'] = this.idsSeleccionado;
|
|
1687
|
-
}
|
|
1688
|
-
// opAdic['refTabla'] = this;
|
|
1689
|
-
objMenu = { ...objMenu, ...opAdic };
|
|
1690
|
-
if (retorno) {
|
|
1691
|
-
return objMenu;
|
|
1692
|
-
}
|
|
1693
|
-
// console.warn(objMenu);
|
|
1694
|
-
this.opcionSelecionada.emit(objMenu);
|
|
1695
|
-
return 1;
|
|
1696
|
-
}
|
|
1697
|
-
emitirResultados(evento = {}) {
|
|
1698
|
-
this.opcFiltroActual = { ...this.opcFiltroActual, ...evento, ...this.cargarData(true) };
|
|
1699
|
-
// console.warn('resultadosFILTRO', this.opcFiltroActual);
|
|
1700
|
-
this.resultados.emit(this.opcFiltroActual);
|
|
1701
|
-
}
|
|
1702
|
-
abrirMenuContextual({ x, y }, user) {
|
|
1703
|
-
// console.log(user);
|
|
1704
|
-
// this.opcMenu(user, {tipo: 'ver'});
|
|
1705
|
-
this.objSeleccionado = user;
|
|
1706
|
-
this.cerrarMenuContextual();
|
|
1707
|
-
const positionStrategy = this.overlay.position().flexibleConnectedTo({ x, y }).withPositions([
|
|
1708
|
-
{
|
|
1709
|
-
originX: 'end',
|
|
1710
|
-
originY: 'bottom',
|
|
1711
|
-
overlayX: 'end',
|
|
1712
|
-
overlayY: 'top',
|
|
1713
|
-
},
|
|
1714
|
-
]);
|
|
1715
|
-
this.overlayRef = this.overlay.create({
|
|
1716
|
-
positionStrategy,
|
|
1717
|
-
scrollStrategy: this.overlay.scrollStrategies.close(),
|
|
1718
|
-
});
|
|
1719
|
-
this.overlayRef.attach(new TemplatePortal(this.userMenu, this.viewContainerRef, {
|
|
1720
|
-
// $implicit: user
|
|
1721
|
-
item: user,
|
|
1722
|
-
}));
|
|
1723
|
-
this.mouseEvent$ = fromEvent(document, 'click').pipe(filter(event => {
|
|
1724
|
-
const clickTarget = event.target;
|
|
1725
|
-
return !!this.overlayRef && !this.overlayRef.overlayElement.contains(clickTarget);
|
|
1726
|
-
}), take(1)).subscribe(() => this.cerrarMenuContextual());
|
|
1727
|
-
}
|
|
1728
|
-
cerrarMenuContextual() {
|
|
1729
|
-
this.mouseEvent$ && this.mouseEvent$.unsubscribe();
|
|
1730
|
-
if (this.overlayRef) {
|
|
1731
|
-
this.overlayRef.dispose();
|
|
1732
|
-
this.overlayRef = undefined;
|
|
1733
|
-
}
|
|
1734
|
-
}
|
|
1735
|
-
emitirAccionRecargar() {
|
|
1736
|
-
if (!this.idTabla) {
|
|
1737
|
-
this.objSeleccionado = null;
|
|
1738
|
-
}
|
|
1739
|
-
this.accionRecargar.emit(this.opcFiltroActual);
|
|
1740
|
-
// this.accionRecargar.emit({ ...this.opcFiltroActual, ...{seleccionado: this.objSeleccionado}});
|
|
1741
|
-
}
|
|
1742
|
-
tipoValorFuncion = tipoValorFuncion;
|
|
1743
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, deps: [{ token: i1$2.FormBuilder }, { token: i2$2.Overlay }, { token: i0.ViewContainerRef }, { token: TablaMantenimientoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1744
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento", inputs: { dataSuscription: "dataSuscription", objThis: "objThis", nombreColeccion: "nombreColeccion", ctrlBusquedaValue: "ctrlBusquedaValue", ctrlBusquedaPlaceholder: "ctrlBusquedaPlaceholder", filtroCampos: "filtroCampos", paginador: "paginador", esTabla: "esTabla", readOnly: "readOnly", filaExtraHeader: "filaExtraHeader", filaFooter: "filaFooter", botonesCRUD: "botonesCRUD", objBotonesCRUD: "objBotonesCRUD", classSeleccionado: "classSeleccionado", classAnulado: "classAnulado", campoAnulado: "campoAnulado", campoAnuladoMensaje: "campoAnuladoMensaje", selectionModel: "selectionModel", filaExtraTemplate: "filaExtraTemplate", exportarExcel: "exportarExcel", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", derechosActuales: "derechosActuales", ctrlBusqueda: "ctrlBusqueda", leyenda: "leyenda", idTabla: "idTabla", columnasTabla: "columnasTabla", botonesMenu: "botonesMenu", condicionesClaseFila: "condicionesClaseFila", rowTooltip: "rowTooltip", soloIconos: "soloIconos" }, outputs: { dblclickItem: "dblclickItem", opcionSelecionada: "opcionSelecionada", opcBusqueda: "opcBusqueda", accionRecargar: "accionRecargar", selectionModelChange: "selectionModelChange", dataSourceChange: "dataSourceChange", resultados: "resultados" }, host: { properties: { "id": "this.id" }, classAttribute: "jvs-tabla-mantenimiento" }, providers: [
|
|
1745
|
-
{ provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
|
|
1746
|
-
], queries: [{ propertyName: "columnDefs", predicate: MatColumnDef, descendants: true }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "rowFooter", first: true, predicate: MatFooterRow, descendants: true, read: ElementRef }, { propertyName: "userMenu", first: true, predicate: ["userMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col h-fit\">\n <div class=\"grow flex items-center justify-between bg-white\">\n <ng-content select=\"[filtro]\"></ng-content>\n </div>\n\n <div class=\"flex flex-col border-t\">\n <div class=\"flex-1 bg-app-bar flex items-center justify-between p-1\">\n <!-- <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">-->\n <!-- </div>-->\n <div class=\"flex items-center flex-wrap mr-1 h-full\" *ngIf=\"leyenda\">\n <span class=\"font-bold\" [class]=\"leyenda.class\">{{ leyenda.text }}</span>\n </div>\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.izquierda ?? []).length > 0 \" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.izquierda; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.izquierda?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.crud ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.crud; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.crud?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.principal ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.principal; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.principal?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.derecha ?? []).length > 0\" class=\"flex-auto flex items-center justify-end contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.derecha; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.derecha?.length}}\"></ng-container>\n </ng-container>\n </div>\n <ng-content select=\"[objetosMenuPegado]\"></ng-content>\n </div>\n <div class=\"flex flex-1 sm:hidden items-center flex-wrap gap-1\">\n <button class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matRipple\n matTooltip=\"Botones de Acci\u00F3n\"\n type=\"button\"\n [matMenuTriggerFor]=\"menuOpciones\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundMenu\"></mat-icon>\n </button>\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <div class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <ng-content select=\"[objetosMenu]\"></ng-content>\n </div>\n </div>\n <div *ngIf=\"ctrlBusqueda\" class=\"hidden flex-initial sm:flex items-center form-input max-w-[150px] bg-card rounded-full border m-1 px-1 border-l-2\"\n >\n <mat-icon svgIcon=\"roundSearch\" class=\"icon-xs\"></mat-icon>\n <input [formControl]=\"cCampoBusqueda\"\n class=\"text-xs px-1 py-1 border-0 outline-none w-full bg-transparent max-w-sm\"\n [placeholder]=\"ctrlBusquedaPlaceholder\"\n (keyup.enter)=\"ctrlBusqueda == 'query' ? cargarData() : false;\"\n type=\"search\">\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <ng-content select=\"[botonesFiltro]\"></ng-content>\n <button matRipple *ngIf=\"isRecargarUsed || ctrlBusqueda == 'query'\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1 text-green-700\"\n matTooltip=\"Actualizar datos\"\n (click)=\"(ctrlBusqueda == 'query' ? cargarData() : emitirAccionRecargar())\"\n type=\"button\">\n <mat-icon svgIcon=\"roundRefresh\" class=\"icon-xs\"></mat-icon>\n\n </button>\n <button matRipple [matMenuTriggerFor]=\"columnFilterMenu\" *ngIf=\"filtroCampos\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matTooltip=\"Columnas Filtro\"\n type=\"button\">\n <mat-icon svgIcon=\"roundFilterList\" class=\"icon-xs\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.secundario ?? []).length > 0\" class=\"flex-1 bg-app-bar flex items-center justify-between p-1 border-t\">\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.secundario; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.secundario?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <pre>{{ this.chkLista.modelosChk | json }}</pre>\n <pre>{{ this.chkLista.checkbox.cantidadActivos | json }}</pre>\n <pre>{{ this.chkLista.checkbox.algunosActivos | json }}</pre>\n </div>-->\n <div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n\n <table [id]=\"'tabla_' + nombreColeccion\" [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"true\"\n [hidden]=\"!esTabla\"\n class=\"flex-1 table-mantenimiento table-auto h-fit\" mat-table matSort\n [trackBy]=\"trackByFn\"\n #tablaMantenimiento\n >\n\n <!--<table [dataSource]=\"dataSource\" class=\"table-mantenimiento table-auto h-auto w-full justify-center\" mat-table matSort>-->\n\n\n <ng-content select=\"[tableDefinitions]\"></ng-content>\n <ng-container matColumnDef=\"numeracion_automatica\">\n <th mat-header-cell *matHeaderCellDef style=\"width: 16px !important\">N\u00BA</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\" class=\"p-0 celda-numeracion-fila\">\n <div class=\"flex items-center justify-center font-bold numeracionFila\">\n <ng-container *ngIf=\"esTabla && paginador\">\n {{ (this.paginator?.pageIndex == 0 ? i + 1 : 1 + i + (this.paginator?.pageIndex ?? 1) * (this.paginator?.pageSize ?? 1)) }}\n </ng-container>\n <ng-container *ngIf=\"!paginador\">\n {{ (i + 1) }}\n </ng-container>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"uppercase\"></td>\n </ng-container>\n <jvs-tabla-mantenimiento-column-defs [objThis]=\"this\" [colDetalle]=\"columnasTabla\"\n [nombreColeccion]=\"nombreColeccion\" [(chkLista)]=\"chkLista\"></jvs-tabla-mantenimiento-column-defs>\n\n <tr *matHeaderRowDef=\"visibleColumns; sticky: true\" mat-header-row class=\"title\" matHeader\n ></tr>\n\n <ng-container *ngIf=\"!!filaExtraHeader\">\n <tr mat-row *matRowDef=\"let row; columns: ['filaExtraHeader']\" class=\"student-detail-row\"\n [style.height.px]=\"0\"\n ></tr>\n\n <ng-container matColumnDef=\"filaExtraHeader\">\n <td mat-cell *matCellDef=\"let row; let i = dataIndex\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"(i == 0 && filaExtraHeader.esVisible && filaExtraHeader.esVisible()) ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container *ngIf=\"filaExtraHeader.template\"\n [ngTemplateOutlet]=\"filaExtraHeader.template\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"filaFooter\">\n <tr *matFooterRowDef=\"visibleColumns\" mat-footer-row\n [style.height.px]=\"0\"\n [id]=\"nombreColeccion + '_filaFooter'\"\n ></tr>\n </ng-container>\n\n <!--\t<tr\n *matRowDef=\"let row; columns: visibleColumns;\"\n class=\"hover:bg-secondary trans-ease-out cursor-pointer\"\n mat-row></tr>-->\n <tr\n [matRowKeyboardSelection]=\"tablaMantenimiento\"\n [rowModel]=\"row\"\n (seleccionarSiguiente)=\"opcMenu($event, {seccion: nombreColeccion, tipo: 'ver'});\"\n\n *matRowDef=\"let row; let idxTabla = dataIndex; columns: visibleColumns;\"\n (click)=\"seleccionarItem(row); opcMenu(row, {seccion: nombreColeccion, tipo: 'ver', tableDataIndex: idxTabla });\"\n (dblclick)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'seleccionar'}); dblclickItem.emit(row)\"\n (contextmenu)=\"(abrirMenuContextual($event, row)); $event. preventDefault();\"\n [ngClass]=\"classFila(row)\"\n @fadeInUp\n class=\"trans-ease-out cursor-pointer h-auto\"\n [style.height.px]=\"0\"\n [id]=\"propiedadSeleccion(row)\"\n [matTooltip]=\"procesarRowTooltip(row)\"\n matTooltipPosition=\"below\"\n [matTooltipPositionAtOrigin]=\"true\"\n [matTooltipClass]=\"['bg-red-700', 'text-red-100', 'm-0']\"\n [matTooltipDisabled]=\"!procesarRowTooltip(row)\"\n [class.regAnulado]=\"row[campoAnulado] == 1\"\n [class.regTooltip]=\"!!procesarRowTooltip(row)\"\n (keyup.delete)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'eliminar'})\"\n mat-row></tr>\n <ng-container *ngIf=\"filaExtraTemplate\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"student-detail-row h-0\"></tr>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"row.isExpanded ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container [ngTemplateOutlet]=\"filaExtraTemplate\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n </table>\n\n <ng-container *ngIf=\"componenteCargadoTotalmente\">\n <div *ngIf=\"(noData | async) && esTabla\" class=\"flex-1 text-center text-secondary font-medium\">\n No se encontraron datos\n </div>\n </ng-container>\n </div>\n <ng-content select=\"[appendTable]\"></ng-content>\n <div class=\"flex-1 bg-app-bar flex flex-col sm:flex-row items-start justify-between p-1\">\n <div class=\"flex-1 flex items-start flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.inferior ?? []).length > 0\" class=\" flex items-center flex-wrap\">\n <ng-container *ngFor=\"let btn of botonesMenu.inferior; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.inferior?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"esTabla && paginador\" class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <mat-paginator class=\"tabla-mantenimiento-paginador\" [pageSizeOptions]=\"paginacion.pageSizeOptions\" [pageIndex]=\"paginacion.pageIndex - 1\" [length]=\"paginacion.pageLength\" [pageSize]=\"paginacion.pageSize\" (page)=\"paginacion.pageCurrent = $event; emitirResultados();\" ></mat-paginator>\n </div>\n </div>\n </div>\n\n</div>\n\n\n\n<!-- SECCION DE TEMPLATES O MENUS -->\n\n\n<mat-menu #columnFilterMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let column of columnasTabla\">\n <button (click)=\"toggleColumnVisibility(column, $event)\" *ngIf=\"!tipoValorFuncion(column.noMostrarEnLista, false)\"\n class=\"checkbox-item mat-menu-item\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" [(ngModel)]=\"column.visible\" [ngModelOptions]=\"{standalone: true}\" color=\"primary\">\n <span [innerHTML]=\"(column.labelLista ?? column.label).replace('<br>', ' ')\"></span>\n </mat-checkbox>\n </button>\n </ng-container>\n</mat-menu>\n\n\n\n\n\n\n<ng-template #botonesSuperiores let-btn=\"btn\" let-idx=\"idx\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: true, idx: idx}\"></ng-container>\n</ng-template>\n\n<ng-template #botonesContextual let-btn=\"btn\" let-item=\"item\" let-barraSuperior=\"barraSuperior\" let-idx=\"idx\">\n\n <ng-container *ngIf=\"barraSuperior; else noBarraSuperior\">\n\n <!--\t\t<button mat-button style=\"min-width: unset; border: 1px !important;\" class=\"uppercase border border-gray rounded-none h-full px-1 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\">-->\n <!--\t\t\t<mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" size=\"15px\" class=\"icon-xs\"></mat-icon>-->\n <!--\t\t</button>-->\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"(!btn.esVisible || btn.esVisible(item, this)) && subItemsActivos(btn, item)\"\n [class]=\"(btn.class?btn.class:'')\"\n\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"icon-xs\" svgIcon=\"fa5sCaretDown\" ></mat-icon>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"!btn.esVisible || btn.esVisible(item, this)\"\n [class]=\"(btn.class?btn.class:'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo])) && !(['nuevo', 'editar', 'eliminar'].includes(btn.tipo))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </button>\n\n </ng-container>\n\n </ng-container>\n <ng-template #noBarraSuperior>\n\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn); $event.stopPropagation();\"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\"\n >\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"\n class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"flex-none icon-xs\" svgIcon=\"fa5sCaretRight\"></mat-icon>\n </div>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <ng-container *ngIf=\"btn.tipo == '-#SEPARADOR#-'; else itemsNormales\">\n <mat-divider></mat-divider>\n </ng-container>\n <ng-template #itemsNormales>\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\">\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </div>\n </button>\n </ng-template>\n\n </ng-container>\n\n </ng-template>\n\n</ng-template>\n\n<ng-template #userMenu let-item=\"item\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n\n<mat-menu #menuOpciones=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container\n *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n</mat-menu>\n\n", styles: ["@charset \"UTF-8\";:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164);--mat-paginator-container-size: 30px}:root .table-mantenimiento .elemento-seleccionado{background-color:var(--tabla-mantenimiento-seleccion-fondo)!important;color:var(--tabla-mantenimiento-seleccion-texto)!important;border-color:var(--tabla-mantenimiento-seleccion-texto)!important}.jvs-tabla-mantenimiento{width:inherit}.jvs-tabla-mantenimiento .contenedor-botones>*:first-child{@apply rounded-l;}.jvs-tabla-mantenimiento .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child div:first-child:before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child div:first-child:before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child:not(:has(div)):before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child:not(:has(div)):before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}.jvs-tabla-mantenimiento .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}.jvs-tabla-mantenimiento .mat-mdc-menu-panel{min-height:auto!important}.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-cell,.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}.jvs-tabla-mantenimiento .table-container{max-height:600px!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}.jvs-tabla-mantenimiento .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}.jvs-tabla-mantenimiento .table-mantenimiento th .form-input{@apply w-auto;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}.jvs-tabla-mantenimiento .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i9.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i3$1.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i2.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: TablaMantenimientoColumnDefsComponent, selector: "jvs-tabla-mantenimiento-column-defs", inputs: ["objThis", "nombreColeccion", "colDetalle", "chkLista"], outputs: ["chkListaChange"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i14.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: TablaMantenimientoMenuComponent, selector: "jvs-tabla-mantenimiento-menu", inputs: ["objThis", "nombreColeccion", "item", "derechosActuales", "subItems", "botonTemplate"], outputs: ["opcionSelecionada"] }, { kind: "directive", type: MatRowKeyboardSelectionDirective, selector: "[matRowKeyboardSelection]", inputs: ["matRowKeyboardSelection", "rowModel"], outputs: ["seleccionarSiguiente"] }], animations: [
|
|
1747
|
-
trigger('detailExpand', [
|
|
1748
|
-
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
1749
|
-
state('expanded', style({ height: '*' })),
|
|
1750
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
1751
|
-
]),
|
|
1752
|
-
trigger('fadeInUp', [
|
|
1753
|
-
transition(':enter', [
|
|
1754
|
-
style({
|
|
1755
|
-
transform: 'translateY(20px)',
|
|
1756
|
-
opacity: 0
|
|
1757
|
-
}),
|
|
1758
|
-
animate(`400ms cubic-bezier(0.35, 0, 0.25, 1)`, style({
|
|
1759
|
-
transform: 'translateY(0)',
|
|
1760
|
-
opacity: 1
|
|
1761
|
-
}))
|
|
1762
|
-
])
|
|
1763
|
-
]),
|
|
1764
|
-
] });
|
|
1765
|
-
};
|
|
1766
|
-
TablaMantenimientoComponent = TablaMantenimientoComponent_1 = __decorate([
|
|
1767
|
-
UntilDestroy({ checkProperties: true })
|
|
1768
|
-
], TablaMantenimientoComponent);
|
|
1769
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, decorators: [{
|
|
1770
|
-
type: Component,
|
|
1771
|
-
args: [{ selector: 'jvs-tabla-mantenimiento', standalone: true, imports: [
|
|
1772
|
-
CommonModule,
|
|
1773
|
-
FormsModule,
|
|
1774
|
-
MatCheckboxModule,
|
|
1775
|
-
MatDividerModule,
|
|
1776
|
-
MatIconModule,
|
|
1777
|
-
MatMenuModule,
|
|
1778
|
-
MatPaginatorModule,
|
|
1779
|
-
MatRippleModule,
|
|
1780
|
-
MatSortModule,
|
|
1781
|
-
MatTableModule,
|
|
1782
|
-
MatTooltipModule,
|
|
1783
|
-
ReactiveFormsModule,
|
|
1784
|
-
TablaMantenimientoColumnDefsComponent,
|
|
1785
|
-
MatBadgeModule,
|
|
1786
|
-
TablaMantenimientoMenuComponent,
|
|
1787
|
-
MatRowKeyboardSelectionDirective,
|
|
1788
|
-
], host: {
|
|
1789
|
-
class: 'jvs-tabla-mantenimiento',
|
|
1790
|
-
}, animations: [
|
|
1791
|
-
trigger('detailExpand', [
|
|
1792
|
-
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
1793
|
-
state('expanded', style({ height: '*' })),
|
|
1794
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
1795
|
-
]),
|
|
1796
|
-
trigger('fadeInUp', [
|
|
1797
|
-
transition(':enter', [
|
|
1798
|
-
style({
|
|
1799
|
-
transform: 'translateY(20px)',
|
|
1800
|
-
opacity: 0
|
|
1801
|
-
}),
|
|
1802
|
-
animate(`400ms cubic-bezier(0.35, 0, 0.25, 1)`, style({
|
|
1803
|
-
transform: 'translateY(0)',
|
|
1804
|
-
opacity: 1
|
|
1805
|
-
}))
|
|
1806
|
-
])
|
|
1807
|
-
]),
|
|
1808
|
-
], providers: [
|
|
1809
|
-
{ provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
|
|
1810
|
-
], template: "<div class=\"flex flex-col h-fit\">\n <div class=\"grow flex items-center justify-between bg-white\">\n <ng-content select=\"[filtro]\"></ng-content>\n </div>\n\n <div class=\"flex flex-col border-t\">\n <div class=\"flex-1 bg-app-bar flex items-center justify-between p-1\">\n <!-- <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">-->\n <!-- </div>-->\n <div class=\"flex items-center flex-wrap mr-1 h-full\" *ngIf=\"leyenda\">\n <span class=\"font-bold\" [class]=\"leyenda.class\">{{ leyenda.text }}</span>\n </div>\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.izquierda ?? []).length > 0 \" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.izquierda; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.izquierda?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.crud ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.crud; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.crud?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.principal ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.principal; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.principal?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.derecha ?? []).length > 0\" class=\"flex-auto flex items-center justify-end contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.derecha; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.derecha?.length}}\"></ng-container>\n </ng-container>\n </div>\n <ng-content select=\"[objetosMenuPegado]\"></ng-content>\n </div>\n <div class=\"flex flex-1 sm:hidden items-center flex-wrap gap-1\">\n <button class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matRipple\n matTooltip=\"Botones de Acci\u00F3n\"\n type=\"button\"\n [matMenuTriggerFor]=\"menuOpciones\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundMenu\"></mat-icon>\n </button>\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <div class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <ng-content select=\"[objetosMenu]\"></ng-content>\n </div>\n </div>\n <div *ngIf=\"ctrlBusqueda\" class=\"hidden flex-initial sm:flex items-center form-input max-w-[150px] bg-card rounded-full border m-1 px-1 border-l-2\"\n >\n <mat-icon svgIcon=\"roundSearch\" class=\"icon-xs\"></mat-icon>\n <input [formControl]=\"cCampoBusqueda\"\n class=\"text-xs px-1 py-1 border-0 outline-none w-full bg-transparent max-w-sm\"\n [placeholder]=\"ctrlBusquedaPlaceholder\"\n (keyup.enter)=\"ctrlBusqueda == 'query' ? cargarData() : false;\"\n type=\"search\">\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <ng-content select=\"[botonesFiltro]\"></ng-content>\n <button matRipple *ngIf=\"isRecargarUsed || ctrlBusqueda == 'query'\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1 text-green-700\"\n matTooltip=\"Actualizar datos\"\n (click)=\"(ctrlBusqueda == 'query' ? cargarData() : emitirAccionRecargar())\"\n type=\"button\">\n <mat-icon svgIcon=\"roundRefresh\" class=\"icon-xs\"></mat-icon>\n\n </button>\n <button matRipple [matMenuTriggerFor]=\"columnFilterMenu\" *ngIf=\"filtroCampos\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matTooltip=\"Columnas Filtro\"\n type=\"button\">\n <mat-icon svgIcon=\"roundFilterList\" class=\"icon-xs\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.secundario ?? []).length > 0\" class=\"flex-1 bg-app-bar flex items-center justify-between p-1 border-t\">\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.secundario; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.secundario?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <pre>{{ this.chkLista.modelosChk | json }}</pre>\n <pre>{{ this.chkLista.checkbox.cantidadActivos | json }}</pre>\n <pre>{{ this.chkLista.checkbox.algunosActivos | json }}</pre>\n </div>-->\n <div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n\n <table [id]=\"'tabla_' + nombreColeccion\" [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"true\"\n [hidden]=\"!esTabla\"\n class=\"flex-1 table-mantenimiento table-auto h-fit\" mat-table matSort\n [trackBy]=\"trackByFn\"\n #tablaMantenimiento\n >\n\n <!--<table [dataSource]=\"dataSource\" class=\"table-mantenimiento table-auto h-auto w-full justify-center\" mat-table matSort>-->\n\n\n <ng-content select=\"[tableDefinitions]\"></ng-content>\n <ng-container matColumnDef=\"numeracion_automatica\">\n <th mat-header-cell *matHeaderCellDef style=\"width: 16px !important\">N\u00BA</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\" class=\"p-0 celda-numeracion-fila\">\n <div class=\"flex items-center justify-center font-bold numeracionFila\">\n <ng-container *ngIf=\"esTabla && paginador\">\n {{ (this.paginator?.pageIndex == 0 ? i + 1 : 1 + i + (this.paginator?.pageIndex ?? 1) * (this.paginator?.pageSize ?? 1)) }}\n </ng-container>\n <ng-container *ngIf=\"!paginador\">\n {{ (i + 1) }}\n </ng-container>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"uppercase\"></td>\n </ng-container>\n <jvs-tabla-mantenimiento-column-defs [objThis]=\"this\" [colDetalle]=\"columnasTabla\"\n [nombreColeccion]=\"nombreColeccion\" [(chkLista)]=\"chkLista\"></jvs-tabla-mantenimiento-column-defs>\n\n <tr *matHeaderRowDef=\"visibleColumns; sticky: true\" mat-header-row class=\"title\" matHeader\n ></tr>\n\n <ng-container *ngIf=\"!!filaExtraHeader\">\n <tr mat-row *matRowDef=\"let row; columns: ['filaExtraHeader']\" class=\"student-detail-row\"\n [style.height.px]=\"0\"\n ></tr>\n\n <ng-container matColumnDef=\"filaExtraHeader\">\n <td mat-cell *matCellDef=\"let row; let i = dataIndex\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"(i == 0 && filaExtraHeader.esVisible && filaExtraHeader.esVisible()) ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container *ngIf=\"filaExtraHeader.template\"\n [ngTemplateOutlet]=\"filaExtraHeader.template\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"filaFooter\">\n <tr *matFooterRowDef=\"visibleColumns\" mat-footer-row\n [style.height.px]=\"0\"\n [id]=\"nombreColeccion + '_filaFooter'\"\n ></tr>\n </ng-container>\n\n <!--\t<tr\n *matRowDef=\"let row; columns: visibleColumns;\"\n class=\"hover:bg-secondary trans-ease-out cursor-pointer\"\n mat-row></tr>-->\n <tr\n [matRowKeyboardSelection]=\"tablaMantenimiento\"\n [rowModel]=\"row\"\n (seleccionarSiguiente)=\"opcMenu($event, {seccion: nombreColeccion, tipo: 'ver'});\"\n\n *matRowDef=\"let row; let idxTabla = dataIndex; columns: visibleColumns;\"\n (click)=\"seleccionarItem(row); opcMenu(row, {seccion: nombreColeccion, tipo: 'ver', tableDataIndex: idxTabla });\"\n (dblclick)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'seleccionar'}); dblclickItem.emit(row)\"\n (contextmenu)=\"(abrirMenuContextual($event, row)); $event. preventDefault();\"\n [ngClass]=\"classFila(row)\"\n @fadeInUp\n class=\"trans-ease-out cursor-pointer h-auto\"\n [style.height.px]=\"0\"\n [id]=\"propiedadSeleccion(row)\"\n [matTooltip]=\"procesarRowTooltip(row)\"\n matTooltipPosition=\"below\"\n [matTooltipPositionAtOrigin]=\"true\"\n [matTooltipClass]=\"['bg-red-700', 'text-red-100', 'm-0']\"\n [matTooltipDisabled]=\"!procesarRowTooltip(row)\"\n [class.regAnulado]=\"row[campoAnulado] == 1\"\n [class.regTooltip]=\"!!procesarRowTooltip(row)\"\n (keyup.delete)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'eliminar'})\"\n mat-row></tr>\n <ng-container *ngIf=\"filaExtraTemplate\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"student-detail-row h-0\"></tr>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"row.isExpanded ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container [ngTemplateOutlet]=\"filaExtraTemplate\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n </table>\n\n <ng-container *ngIf=\"componenteCargadoTotalmente\">\n <div *ngIf=\"(noData | async) && esTabla\" class=\"flex-1 text-center text-secondary font-medium\">\n No se encontraron datos\n </div>\n </ng-container>\n </div>\n <ng-content select=\"[appendTable]\"></ng-content>\n <div class=\"flex-1 bg-app-bar flex flex-col sm:flex-row items-start justify-between p-1\">\n <div class=\"flex-1 flex items-start flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.inferior ?? []).length > 0\" class=\" flex items-center flex-wrap\">\n <ng-container *ngFor=\"let btn of botonesMenu.inferior; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.inferior?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"esTabla && paginador\" class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <mat-paginator class=\"tabla-mantenimiento-paginador\" [pageSizeOptions]=\"paginacion.pageSizeOptions\" [pageIndex]=\"paginacion.pageIndex - 1\" [length]=\"paginacion.pageLength\" [pageSize]=\"paginacion.pageSize\" (page)=\"paginacion.pageCurrent = $event; emitirResultados();\" ></mat-paginator>\n </div>\n </div>\n </div>\n\n</div>\n\n\n\n<!-- SECCION DE TEMPLATES O MENUS -->\n\n\n<mat-menu #columnFilterMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let column of columnasTabla\">\n <button (click)=\"toggleColumnVisibility(column, $event)\" *ngIf=\"!tipoValorFuncion(column.noMostrarEnLista, false)\"\n class=\"checkbox-item mat-menu-item\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" [(ngModel)]=\"column.visible\" [ngModelOptions]=\"{standalone: true}\" color=\"primary\">\n <span [innerHTML]=\"(column.labelLista ?? column.label).replace('<br>', ' ')\"></span>\n </mat-checkbox>\n </button>\n </ng-container>\n</mat-menu>\n\n\n\n\n\n\n<ng-template #botonesSuperiores let-btn=\"btn\" let-idx=\"idx\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: true, idx: idx}\"></ng-container>\n</ng-template>\n\n<ng-template #botonesContextual let-btn=\"btn\" let-item=\"item\" let-barraSuperior=\"barraSuperior\" let-idx=\"idx\">\n\n <ng-container *ngIf=\"barraSuperior; else noBarraSuperior\">\n\n <!--\t\t<button mat-button style=\"min-width: unset; border: 1px !important;\" class=\"uppercase border border-gray rounded-none h-full px-1 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\">-->\n <!--\t\t\t<mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" size=\"15px\" class=\"icon-xs\"></mat-icon>-->\n <!--\t\t</button>-->\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"(!btn.esVisible || btn.esVisible(item, this)) && subItemsActivos(btn, item)\"\n [class]=\"(btn.class?btn.class:'')\"\n\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"icon-xs\" svgIcon=\"fa5sCaretDown\" ></mat-icon>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"!btn.esVisible || btn.esVisible(item, this)\"\n [class]=\"(btn.class?btn.class:'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo])) && !(['nuevo', 'editar', 'eliminar'].includes(btn.tipo))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </button>\n\n </ng-container>\n\n </ng-container>\n <ng-template #noBarraSuperior>\n\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn); $event.stopPropagation();\"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\"\n >\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"\n class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"flex-none icon-xs\" svgIcon=\"fa5sCaretRight\"></mat-icon>\n </div>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <ng-container *ngIf=\"btn.tipo == '-#SEPARADOR#-'; else itemsNormales\">\n <mat-divider></mat-divider>\n </ng-container>\n <ng-template #itemsNormales>\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\">\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </div>\n </button>\n </ng-template>\n\n </ng-container>\n\n </ng-template>\n\n</ng-template>\n\n<ng-template #userMenu let-item=\"item\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n\n<mat-menu #menuOpciones=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container\n *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n</mat-menu>\n\n", styles: ["@charset \"UTF-8\";:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164);--mat-paginator-container-size: 30px}:root .table-mantenimiento .elemento-seleccionado{background-color:var(--tabla-mantenimiento-seleccion-fondo)!important;color:var(--tabla-mantenimiento-seleccion-texto)!important;border-color:var(--tabla-mantenimiento-seleccion-texto)!important}.jvs-tabla-mantenimiento{width:inherit}.jvs-tabla-mantenimiento .contenedor-botones>*:first-child{@apply rounded-l;}.jvs-tabla-mantenimiento .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child div:first-child:before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child div:first-child:before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child:not(:has(div)):before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child:not(:has(div)):before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}.jvs-tabla-mantenimiento .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}.jvs-tabla-mantenimiento .mat-mdc-menu-panel{min-height:auto!important}.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-cell,.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}.jvs-tabla-mantenimiento .table-container{max-height:600px!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}.jvs-tabla-mantenimiento .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}.jvs-tabla-mantenimiento .table-mantenimiento th .form-input{@apply w-auto;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}.jvs-tabla-mantenimiento .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}\n"] }]
|
|
1811
|
-
}], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i2$2.Overlay }, { type: i0.ViewContainerRef }, { type: TablaMantenimientoService }, { type: i0.ChangeDetectorRef }], propDecorators: { id: [{
|
|
1812
|
-
type: HostBinding
|
|
1813
|
-
}], dataSuscription: [{
|
|
1814
|
-
type: Input
|
|
1815
|
-
}], objThis: [{
|
|
1816
|
-
type: Input,
|
|
1817
|
-
args: [{ required: true }]
|
|
1818
|
-
}], nombreColeccion: [{
|
|
1819
|
-
type: Input,
|
|
1820
|
-
args: [{ required: true }]
|
|
1821
|
-
}], ctrlBusquedaValue: [{
|
|
1822
|
-
type: Input
|
|
1823
|
-
}], ctrlBusquedaPlaceholder: [{
|
|
1824
|
-
type: Input
|
|
1825
|
-
}], filtroCampos: [{
|
|
1826
|
-
type: Input
|
|
1827
|
-
}], paginador: [{
|
|
1828
|
-
type: Input
|
|
1829
|
-
}], esTabla: [{
|
|
1830
|
-
type: Input
|
|
1831
|
-
}], readOnly: [{
|
|
1832
|
-
type: Input
|
|
1833
|
-
}], filaExtraHeader: [{
|
|
1834
|
-
type: Input
|
|
1835
|
-
}], filaFooter: [{
|
|
1836
|
-
type: Input
|
|
1837
|
-
}], botonesCRUD: [{
|
|
1838
|
-
type: Input
|
|
1839
|
-
}], dblclickItem: [{
|
|
1840
|
-
type: Output
|
|
1841
|
-
}], objBotonesCRUD: [{
|
|
1842
|
-
type: Input
|
|
1843
|
-
}], classSeleccionado: [{
|
|
1844
|
-
type: Input
|
|
1845
|
-
}], classAnulado: [{
|
|
1846
|
-
type: Input
|
|
1847
|
-
}], campoAnulado: [{
|
|
1848
|
-
type: Input
|
|
1849
|
-
}], campoAnuladoMensaje: [{
|
|
1850
|
-
type: Input
|
|
1851
|
-
}], opcionSelecionada: [{
|
|
1852
|
-
type: Output
|
|
1853
|
-
}], opcBusqueda: [{
|
|
1854
|
-
type: Output
|
|
1855
|
-
}], accionRecargar: [{
|
|
1856
|
-
type: Output
|
|
1857
|
-
}], selectionModel: [{
|
|
1858
|
-
type: Input
|
|
1859
|
-
}], selectionModelChange: [{
|
|
1860
|
-
type: Output
|
|
1861
|
-
}], filaExtraTemplate: [{
|
|
1862
|
-
type: Input
|
|
1863
|
-
}], paginator: [{
|
|
1864
|
-
type: ViewChild,
|
|
1865
|
-
args: [MatPaginator]
|
|
1866
|
-
}], sort: [{
|
|
1867
|
-
type: ViewChild,
|
|
1868
|
-
args: [MatSort]
|
|
1869
|
-
}], exportarExcel: [{
|
|
1870
|
-
type: Input
|
|
1871
|
-
}], pageSize: [{
|
|
1872
|
-
type: Input
|
|
1873
|
-
}], pageSizeOptions: [{
|
|
1874
|
-
type: Input
|
|
1875
|
-
}], dataSourceChange: [{
|
|
1876
|
-
type: Output
|
|
1877
|
-
}], resultados: [{
|
|
1878
|
-
type: Output
|
|
1879
|
-
}], table: [{
|
|
1880
|
-
type: ViewChild,
|
|
1881
|
-
args: [MatTable, { static: false }]
|
|
1882
|
-
}], columnDefs: [{
|
|
1883
|
-
type: ContentChildren,
|
|
1884
|
-
args: [MatColumnDef, { descendants: true }]
|
|
1885
|
-
}], derechosActuales: [{
|
|
1886
|
-
type: Input
|
|
1887
|
-
}], rows: [{
|
|
1888
|
-
type: ViewChildren,
|
|
1889
|
-
args: [MatRow, { read: ElementRef }]
|
|
1890
|
-
}], rowFooter: [{
|
|
1891
|
-
type: ViewChild,
|
|
1892
|
-
args: [MatFooterRow, { read: ElementRef }]
|
|
1893
|
-
}], userMenu: [{
|
|
1894
|
-
type: ViewChild,
|
|
1895
|
-
args: ['userMenu']
|
|
1896
|
-
}], ctrlBusqueda: [{
|
|
1897
|
-
type: Input
|
|
1898
|
-
}], leyenda: [{
|
|
1899
|
-
type: Input
|
|
1900
|
-
}], idTabla: [{
|
|
1901
|
-
type: Input,
|
|
1902
|
-
args: [{ required: true }]
|
|
1903
|
-
}], columnasTabla: [{
|
|
1904
|
-
type: Input
|
|
1905
|
-
}], botonesMenu: [{
|
|
1906
|
-
type: Input
|
|
1907
|
-
}], condicionesClaseFila: [{
|
|
1908
|
-
type: Input
|
|
1909
|
-
}], rowTooltip: [{
|
|
1910
|
-
type: Input
|
|
1911
|
-
}], soloIconos: [{
|
|
1912
|
-
type: Input
|
|
1913
|
-
}] } });
|
|
1914
|
-
|
|
1915
|
-
class LucesNavidadComponent {
|
|
1916
|
-
enProduccion = true;
|
|
1917
|
-
forzarMuestra = false;
|
|
1918
|
-
mesActual = new Date().getMonth() + 1;
|
|
1919
|
-
constructor() {
|
|
1920
|
-
}
|
|
1921
|
-
ngOnInit() {
|
|
1922
|
-
}
|
|
1923
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1924
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: LucesNavidadComponent, isStandalone: true, selector: "jvs-luces-navidad, [jvsLucesNavidad]", inputs: { enProduccion: "enProduccion", forzarMuestra: "forzarMuestra" }, ngImport: i0, template: "<ng-container *ngIf=\"forzarMuestra || (mesActual == 12 && enProduccion)\">\n <ul class=\"lightrope\">\n <li *ngFor=\"let e of [].constructor(100); let i = index\"></li>\n </ul>\n <div class=\"christmas-tree\"></div>\n</ng-container>\n", styles: [".lightrope{left:0;text-align:center;white-space:nowrap;overflow:hidden;position:absolute;z-index:1000;margin:-8px 0 0;padding:0;pointer-events:none;width:100%}.lightrope li{position:relative;animation-fill-mode:both;animation-iteration-count:infinite;list-style:none;padding:0;width:6px;height:14px;border-radius:50%;margin:10px;display:inline-block;background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5;animation-name:flash-1;animation-duration:2s}.lightrope li:nth-child(odd){background:#0ff;box-shadow:0 2.3333333333px 12px 1px #00ffff80;animation-name:flash-2;animation-duration:.4s}.lightrope li:nth-child(4n+2){background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094;animation-name:flash-3;animation-duration:1.1s}.lightrope li:nth-child(odd){animation-duration:1.8s}.lightrope li:nth-child(3n+1){animation-duration:1.4s}.lightrope li:before{content:\"\";position:absolute;background:#222;width:4px;height:4.6666666667px;border-radius:3px;top:-2.3333333333px;left:1px}.lightrope li:after{content:\"\";top:-7px;left:3px;position:absolute;width:32px;height:9.3333333333px;border-bottom:solid #222 2px;border-radius:50%}.lightrope li:last-child:after{content:none}.lightrope li:first-child{margin-left:-20px}@keyframes flash-1{0%,to{background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5}50%{background:#00f7a566;box-shadow:0 2.3333333333px 12px 1px #00f7a533}}@keyframes flash-2{0%,to{background:#0ff;box-shadow:0 2.3333333333px 12px 1px #0ff}50%{background:#0ff6;box-shadow:0 2.3333333333px 12px 1px #0ff3}}@keyframes flash-3{0%,to{background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094}50%{background:#f7009466;box-shadow:0 2.3333333333px 12px 1px #f7009433}}.christmas-tree{position:fixed;bottom:20px;left:20px;width:80px;height:120px;background:url(data:image/png;base64,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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"] }] });
|
|
1925
|
-
}
|
|
1926
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, decorators: [{
|
|
1927
|
-
type: Component,
|
|
1928
|
-
args: [{ selector: 'jvs-luces-navidad, [jvsLucesNavidad]', imports: [
|
|
1929
|
-
NgIf,
|
|
1930
|
-
NgForOf
|
|
1931
|
-
], template: "<ng-container *ngIf=\"forzarMuestra || (mesActual == 12 && enProduccion)\">\n <ul class=\"lightrope\">\n <li *ngFor=\"let e of [].constructor(100); let i = index\"></li>\n </ul>\n <div class=\"christmas-tree\"></div>\n</ng-container>\n", styles: [".lightrope{left:0;text-align:center;white-space:nowrap;overflow:hidden;position:absolute;z-index:1000;margin:-8px 0 0;padding:0;pointer-events:none;width:100%}.lightrope li{position:relative;animation-fill-mode:both;animation-iteration-count:infinite;list-style:none;padding:0;width:6px;height:14px;border-radius:50%;margin:10px;display:inline-block;background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5;animation-name:flash-1;animation-duration:2s}.lightrope li:nth-child(odd){background:#0ff;box-shadow:0 2.3333333333px 12px 1px #00ffff80;animation-name:flash-2;animation-duration:.4s}.lightrope li:nth-child(4n+2){background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094;animation-name:flash-3;animation-duration:1.1s}.lightrope li:nth-child(odd){animation-duration:1.8s}.lightrope li:nth-child(3n+1){animation-duration:1.4s}.lightrope li:before{content:\"\";position:absolute;background:#222;width:4px;height:4.6666666667px;border-radius:3px;top:-2.3333333333px;left:1px}.lightrope li:after{content:\"\";top:-7px;left:3px;position:absolute;width:32px;height:9.3333333333px;border-bottom:solid #222 2px;border-radius:50%}.lightrope li:last-child:after{content:none}.lightrope li:first-child{margin-left:-20px}@keyframes flash-1{0%,to{background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5}50%{background:#00f7a566;box-shadow:0 2.3333333333px 12px 1px #00f7a533}}@keyframes flash-2{0%,to{background:#0ff;box-shadow:0 2.3333333333px 12px 1px #0ff}50%{background:#0ff6;box-shadow:0 2.3333333333px 12px 1px #0ff3}}@keyframes flash-3{0%,to{background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094}50%{background:#f7009466;box-shadow:0 2.3333333333px 12px 1px #f7009433}}.christmas-tree{position:fixed;bottom:20px;left:20px;width:80px;height:120px;background:url(data:image/png;base64,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) no-repeat center center;background-size:contain;opacity:.8;z-index:1000;animation:glow 3s infinite ease-in-out}@keyframes glow{0%,to{opacity:.8}50%{opacity:1}}\n"] }]
|
|
1932
|
-
}], ctorParameters: () => [], propDecorators: { enProduccion: [{
|
|
1933
|
-
type: Input
|
|
1934
|
-
}], forzarMuestra: [{
|
|
1935
|
-
type: Input
|
|
1936
|
-
}] } });
|
|
1937
|
-
|
|
1938
|
-
class MatSuffixSearchButtonComponent {
|
|
1939
|
-
fControl;
|
|
1940
|
-
eventLimpiar = new EventEmitter();
|
|
1941
|
-
eventBuscar = new EventEmitter();
|
|
1942
|
-
get control() {
|
|
1943
|
-
return this.fControl;
|
|
1944
|
-
}
|
|
1945
|
-
emitirClick() {
|
|
1946
|
-
if (this.control.value) {
|
|
1947
|
-
this.control.reset();
|
|
1948
|
-
this.eventLimpiar.emit(true);
|
|
1949
|
-
}
|
|
1950
|
-
else {
|
|
1951
|
-
this.eventBuscar.emit(true);
|
|
1952
|
-
}
|
|
1953
|
-
}
|
|
1954
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1955
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MatSuffixSearchButtonComponent, isStandalone: true, selector: "div[matSuffix][matSuffixSearchButton]", inputs: { fControl: "fControl" }, outputs: { eventLimpiar: "eventLimpiar", eventBuscar: "eventBuscar" }, host: { classAttribute: "flex items-center justify-start" }, ngImport: i0, template: "<button matRipple type=\"button\" class=\"boton-circular-gris\"\n (click)=\"emitirClick(); $event.preventDefault();\"\n>\n <mat-icon [svgIcon]=\"(control.value ? 'roundCancel' : 'roundSearch')\" class=\"icon-xs\"></mat-icon>\n</button>\n", dependencies: [{ kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
1956
|
-
}
|
|
1957
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, decorators: [{
|
|
1958
|
-
type: Component,
|
|
1959
|
-
args: [{ selector: 'div[matSuffix][matSuffixSearchButton]', imports: [
|
|
1960
|
-
MatRipple,
|
|
1961
|
-
MatIcon
|
|
1962
|
-
], host: {
|
|
1963
|
-
class: 'flex items-center justify-start',
|
|
1964
|
-
}, template: "<button matRipple type=\"button\" class=\"boton-circular-gris\"\n (click)=\"emitirClick(); $event.preventDefault();\"\n>\n <mat-icon [svgIcon]=\"(control.value ? 'roundCancel' : 'roundSearch')\" class=\"icon-xs\"></mat-icon>\n</button>\n" }]
|
|
1965
|
-
}], propDecorators: { fControl: [{
|
|
1966
|
-
type: Input,
|
|
1967
|
-
args: [{ required: true }]
|
|
1968
|
-
}], eventLimpiar: [{
|
|
1969
|
-
type: Output
|
|
1970
|
-
}], eventBuscar: [{
|
|
1971
|
-
type: Output
|
|
1972
|
-
}] } });
|
|
1973
|
-
|
|
1974
|
-
class MenuComponent {
|
|
1975
|
-
cssBoton;
|
|
1976
|
-
title;
|
|
1977
|
-
disabled = false;
|
|
1978
|
-
itemSeleccion;
|
|
1979
|
-
menu = [];
|
|
1980
|
-
action = new EventEmitter();
|
|
1981
|
-
matmenus;
|
|
1982
|
-
menuItems = [];
|
|
1983
|
-
yet = false;
|
|
1984
|
-
_submenus = []; // 🔥 Tipo explícito como Array de Array de BotonMenu
|
|
1985
|
-
get submenus() {
|
|
1986
|
-
return this._submenus.filter(() => true); // Mantiene la estructura, aunque no hace filtro real
|
|
1987
|
-
}
|
|
1988
|
-
ngOnInit() {
|
|
1989
|
-
this.createSubmenus(this.menu, 's0', 1);
|
|
1990
|
-
this.reindex();
|
|
1991
|
-
}
|
|
1992
|
-
ngAfterViewInit() {
|
|
1993
|
-
// Previene errores de Angular al repintar el menú
|
|
1994
|
-
setTimeout(() => {
|
|
1995
|
-
this.yet = true;
|
|
1996
|
-
});
|
|
1997
|
-
}
|
|
1998
|
-
onClick(value) {
|
|
1999
|
-
this.action.emit(value);
|
|
2000
|
-
}
|
|
2001
|
-
getMenu(index) {
|
|
2002
|
-
return index >= 0 && this.matmenus ? this.matmenus.get(index) ?? null : null;
|
|
2003
|
-
}
|
|
2004
|
-
reindex() {
|
|
2005
|
-
// Asigna el índice del ítem del menú
|
|
2006
|
-
this._submenus.forEach((menu) => {
|
|
2007
|
-
menu.forEach((item) => {
|
|
2008
|
-
if (item.idxOpcionCalc !== -1) {
|
|
2009
|
-
item.idxOpcionCalc = this.menuItems.indexOf(item.valorSeleccion ?? '');
|
|
2010
|
-
}
|
|
2011
|
-
});
|
|
2012
|
-
});
|
|
2013
|
-
}
|
|
2014
|
-
createSubmenus(menu, prefix, count) {
|
|
2015
|
-
this.menuItems.push(prefix);
|
|
2016
|
-
this._submenus.push(menu.map((item, index) => ({
|
|
2017
|
-
...item,
|
|
2018
|
-
valorSeleccion: item.subItems ? `${prefix}${index}` : item.valorSeleccion,
|
|
2019
|
-
idxOpcionCalc: item.subItems ? 0 : -1,
|
|
2020
|
-
})));
|
|
2021
|
-
// Llamada recursiva para crear submenús
|
|
2022
|
-
menu.forEach((item, index) => {
|
|
2023
|
-
if (item.subItems) {
|
|
2024
|
-
this.createSubmenus(item.subItems, `${prefix}${index}`, count + 1);
|
|
2025
|
-
}
|
|
2026
|
-
});
|
|
2027
|
-
}
|
|
2028
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2029
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MenuComponent, isStandalone: true, selector: "jvs-menu", inputs: { cssBoton: "cssBoton", title: "title", disabled: "disabled", itemSeleccion: "itemSeleccion", menu: "menu" }, outputs: { action: "action" }, viewQueries: [{ propertyName: "matmenus", predicate: MatMenu, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"yet\">\n <button matRipple [matMenuTriggerFor]=\"matmenus.first\"\n [disabled]=\"disabled\"\n type=\"button\" [class]=\"cssBoton ?? 'boton-circular boton-circular-red border-0'\"\n (click)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\n [matTooltip]=\"title\"\n >\n <ng-content></ng-content>\n </button>\n</ng-container>\n\n<!--<pre class=\"text-indigo-900\">{{_submenus | json}}</pre>-->\n<ng-container *ngFor=\"let menu of _submenus\">\n <!--<pre class=\"text-red-700\">{{menu | json}}</pre>-->\n <mat-menu xPosition=\"before\" yPosition=\"below\" class=\"max-w-none\">\n <ng-container *ngFor=\"let item of menu\">\n <!--<pre *ngIf=\"menu$\" class=\"text-orange-700\">{{item | json}}</pre>-->\n <!--<span>{{ [item.label, item.idxOpcionCalc!=-1 , yet , (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion})), [!item.esVisible , (item.esVisible ? item.esVisible({itemMenu: item, archivo: itemSeleccion}) : 'NO HAY')]] | json }}</span>-->\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc!=-1 && yet && (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion}))\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n [matMenuTriggerFor]=\"getMenu(item.idxOpcionCalc)\">\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}}</span>\n </button>\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc==-1 && (!item.esVisible || item.esVisible(item))\" (click)=\"onClick(item.valorSeleccion)\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n >\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}} </span>\n </button>\n\n </ng-container>\n </mat-menu>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
2030
|
-
}
|
|
2031
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuComponent, decorators: [{
|
|
2032
|
-
type: Component,
|
|
2033
|
-
args: [{ selector: 'jvs-menu', standalone: true, imports: [
|
|
2034
|
-
CommonModule,
|
|
2035
|
-
MatMenuModule,
|
|
2036
|
-
MatIconModule,
|
|
2037
|
-
MatRippleModule,
|
|
2038
|
-
MatTooltipModule,
|
|
2039
|
-
], template: "<ng-container *ngIf=\"yet\">\n <button matRipple [matMenuTriggerFor]=\"matmenus.first\"\n [disabled]=\"disabled\"\n type=\"button\" [class]=\"cssBoton ?? 'boton-circular boton-circular-red border-0'\"\n (click)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\n [matTooltip]=\"title\"\n >\n <ng-content></ng-content>\n </button>\n</ng-container>\n\n<!--<pre class=\"text-indigo-900\">{{_submenus | json}}</pre>-->\n<ng-container *ngFor=\"let menu of _submenus\">\n <!--<pre class=\"text-red-700\">{{menu | json}}</pre>-->\n <mat-menu xPosition=\"before\" yPosition=\"below\" class=\"max-w-none\">\n <ng-container *ngFor=\"let item of menu\">\n <!--<pre *ngIf=\"menu$\" class=\"text-orange-700\">{{item | json}}</pre>-->\n <!--<span>{{ [item.label, item.idxOpcionCalc!=-1 , yet , (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion})), [!item.esVisible , (item.esVisible ? item.esVisible({itemMenu: item, archivo: itemSeleccion}) : 'NO HAY')]] | json }}</span>-->\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc!=-1 && yet && (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion}))\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n [matMenuTriggerFor]=\"getMenu(item.idxOpcionCalc)\">\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}}</span>\n </button>\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc==-1 && (!item.esVisible || item.esVisible(item))\" (click)=\"onClick(item.valorSeleccion)\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n >\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}} </span>\n </button>\n\n </ng-container>\n </mat-menu>\n</ng-container>\n" }]
|
|
2040
|
-
}], propDecorators: { cssBoton: [{
|
|
2041
|
-
type: Input
|
|
2042
|
-
}], title: [{
|
|
2043
|
-
type: Input
|
|
2044
|
-
}], disabled: [{
|
|
2045
|
-
type: Input
|
|
2046
|
-
}], itemSeleccion: [{
|
|
2047
|
-
type: Input
|
|
2048
|
-
}], menu: [{
|
|
2049
|
-
type: Input
|
|
2050
|
-
}], action: [{
|
|
2051
|
-
type: Output
|
|
2052
|
-
}], matmenus: [{
|
|
2053
|
-
type: ViewChildren,
|
|
2054
|
-
args: [MatMenu]
|
|
2055
|
-
}] } });
|
|
2056
|
-
|
|
2057
|
-
function generarArbol(lista, campoId, campoIdPadre, idPadre = null, strChildren = 'hijos') {
|
|
2058
|
-
const node2 = [];
|
|
2059
|
-
lista.filter(n => n[campoIdPadre] === idPadre).forEach(n => {
|
|
2060
|
-
n[strChildren] = generarArbol(lista, campoId, campoIdPadre, n[campoId], strChildren);
|
|
2061
|
-
node2.push(n);
|
|
2062
|
-
});
|
|
2063
|
-
return node2;
|
|
2064
|
-
}
|
|
2065
|
-
|
|
2066
|
-
class ListaArbolComponent {
|
|
2067
|
-
listaSuscription;
|
|
2068
|
-
nombreColeccion;
|
|
2069
|
-
checkbox = false;
|
|
2070
|
-
expandirRecursivo = false;
|
|
2071
|
-
checkboxSeleccionados = [];
|
|
2072
|
-
campoId;
|
|
2073
|
-
campoIdPadre;
|
|
2074
|
-
campoStr;
|
|
2075
|
-
strHijoContainer = 'hijos';
|
|
2076
|
-
menuContextual;
|
|
2077
|
-
classSeleccionado = ['bg-primary-activo', 'text-primary', 'dark:!bg-primary-dark-activo'];
|
|
2078
|
-
classAnulado = ['line-through', 'text-red', 'italic'];
|
|
2079
|
-
campoAnulado;
|
|
2080
|
-
templateTxtData;
|
|
2081
|
-
condicionMostrar;
|
|
2082
|
-
condicionesClaseFila = () => [];
|
|
2083
|
-
set selectionModel(val) {
|
|
2084
|
-
this.objSeleccionado = val;
|
|
2085
|
-
}
|
|
2086
|
-
selectionModelChange = new EventEmitter();
|
|
2087
|
-
seleccionado = new EventEmitter();
|
|
2088
|
-
listaCheck = new EventEmitter();
|
|
2089
|
-
listaCheckObj = new EventEmitter();
|
|
2090
|
-
_idTabla = [];
|
|
2091
|
-
get idTabla() {
|
|
2092
|
-
return this._idTabla;
|
|
2093
|
-
}
|
|
2094
|
-
set idTabla(val) {
|
|
2095
|
-
if (Array.isArray(val)) {
|
|
2096
|
-
this._idTabla = val;
|
|
2097
|
-
}
|
|
2098
|
-
else {
|
|
2099
|
-
this._idTabla.push(val);
|
|
2100
|
-
}
|
|
2101
|
-
}
|
|
2102
|
-
get buscarItemSeleccionado() {
|
|
2103
|
-
const dRet = this.listaOriginal.find(itm => this._seleccionado === this.propiedadSeleccion(itm));
|
|
2104
|
-
return dRet ?? null;
|
|
2105
|
-
}
|
|
2106
|
-
get objSeleccionado() {
|
|
2107
|
-
return this.buscarItemSeleccionado; // ?? this.objThis?.['seleccionados']?.[this.nombreColeccion];
|
|
2108
|
-
}
|
|
2109
|
-
set objSeleccionado(val) {
|
|
2110
|
-
this.seleccionarItem(val, true);
|
|
2111
|
-
}
|
|
2112
|
-
chkLista = new DataModel$1();
|
|
2113
|
-
listaMuestraArbol = [];
|
|
2114
|
-
listaOriginal = [];
|
|
2115
|
-
treeControl = new NestedTreeControl((node) => node[this.strHijoContainer]);
|
|
2116
|
-
_seleccionado = {};
|
|
2117
|
-
ngOnInit() {
|
|
2118
|
-
this.listaSuscription.subscribe(res => {
|
|
2119
|
-
if (res) {
|
|
2120
|
-
this.listaOriginal = res;
|
|
2121
|
-
const listaAs = generarArbol(res, this.campoId, this.campoIdPadre, null, this.strHijoContainer);
|
|
2122
|
-
this.listaMuestraArbol = [];
|
|
2123
|
-
setTimeout(() => {
|
|
2124
|
-
this.listaMuestraArbol = listaAs;
|
|
2125
|
-
}, 1);
|
|
2126
|
-
if (this.checkbox) {
|
|
2127
|
-
this.chkLista.agregarControles(res, this.campoId);
|
|
2128
|
-
this.checkboxSeleccionados.forEach((chkSel) => {
|
|
2129
|
-
this.chkLista.setState(chkSel[this.campoId], true);
|
|
2130
|
-
});
|
|
2131
|
-
this.emitirModeloCheck();
|
|
2132
|
-
}
|
|
2133
|
-
}
|
|
2134
|
-
});
|
|
2135
|
-
}
|
|
2136
|
-
idTablaValor(data) {
|
|
2137
|
-
if (data) {
|
|
2138
|
-
if (this.idTabla.length < 1) {
|
|
2139
|
-
return shortHash(JSON.stringify({ data, claseFinal: undefined }));
|
|
2140
|
-
}
|
|
2141
|
-
return this.idTabla.map(d => data[d]).join('-');
|
|
2142
|
-
}
|
|
2143
|
-
return '';
|
|
2144
|
-
}
|
|
2145
|
-
propiedadSeleccion(item) {
|
|
2146
|
-
return `${this.nombreColeccion}_${this.idTablaValor(item)}`;
|
|
2147
|
-
}
|
|
2148
|
-
esSeleccionActual(item) {
|
|
2149
|
-
return this._seleccionado === this.propiedadSeleccion(item);
|
|
2150
|
-
}
|
|
2151
|
-
seleccionarItem(item, forzado = false) {
|
|
2152
|
-
const idItem = this.propiedadSeleccion(item);
|
|
2153
|
-
console.warn(idItem);
|
|
2154
|
-
if (forzado) {
|
|
2155
|
-
this._seleccionado = idItem;
|
|
2156
|
-
}
|
|
2157
|
-
else {
|
|
2158
|
-
this._seleccionado = this._seleccionado === idItem ? null : idItem;
|
|
2159
|
-
}
|
|
2160
|
-
this.selectionModelChange.emit(this.objSeleccionado);
|
|
2161
|
-
this.seleccionado.emit(this.objSeleccionado);
|
|
2162
|
-
}
|
|
2163
|
-
hasChild = (_, node) => !!node[this.strHijoContainer] && node[this.strHijoContainer].length > 0;
|
|
2164
|
-
opcMenu(v) {
|
|
2165
|
-
// console.warn(v);
|
|
2166
|
-
// console.warn(this.objSeleccionado);
|
|
2167
|
-
const opAdic = { seccion: this.nombreColeccion };
|
|
2168
|
-
opAdic['itemSeleccionado'] = this.objSeleccionado;
|
|
2169
|
-
// v = {...v, ...opAdic};
|
|
2170
|
-
// this.seleccionado.emit(v);
|
|
2171
|
-
}
|
|
2172
|
-
emitirModeloCheck() {
|
|
2173
|
-
this.listaCheck.emit(this.chkLista.generarLista());
|
|
2174
|
-
this.listaCheckObj.emit(this.chkLista.generarLista('object'));
|
|
2175
|
-
}
|
|
2176
|
-
cambiarPadre(checkActual, estado) {
|
|
2177
|
-
const parentId = checkActual[this.campoIdPadre];
|
|
2178
|
-
if (parentId) {
|
|
2179
|
-
const padreAct = this.listaMuestraArbol.find((itm) => itm[this.campoId] == parentId);
|
|
2180
|
-
if (padreAct) {
|
|
2181
|
-
this.chkLista.setState(parentId, this.hijosActivos('checked', padreAct) || this.hijosActivos('indeterminate', padreAct));
|
|
2182
|
-
this.cambiarPadre(padreAct, estado);
|
|
2183
|
-
}
|
|
2184
|
-
}
|
|
2185
|
-
}
|
|
2186
|
-
cambiarCheck(checkActual, estado) {
|
|
2187
|
-
console.log(checkActual, estado);
|
|
2188
|
-
if (this.hasChild(0, checkActual)) {
|
|
2189
|
-
(this.treeControl.getChildren(checkActual) ?? []).forEach((vas) => {
|
|
2190
|
-
this.cambiarCheck(vas, estado);
|
|
2191
|
-
});
|
|
2192
|
-
}
|
|
2193
|
-
this.cambiarPadre(checkActual, estado);
|
|
2194
|
-
this.chkLista.setState(checkActual[this.campoId], estado);
|
|
2195
|
-
}
|
|
2196
|
-
hijosActivos(tipo, checkActual) {
|
|
2197
|
-
let totalHijos = 0;
|
|
2198
|
-
let cantActivo = 0;
|
|
2199
|
-
if (this.hasChild(0, checkActual)) {
|
|
2200
|
-
(this.treeControl.getChildren(checkActual) ?? []).forEach((vas) => {
|
|
2201
|
-
if (this.chkLista.getState(vas[this.campoId] + '')) {
|
|
2202
|
-
cantActivo++;
|
|
2203
|
-
}
|
|
2204
|
-
totalHijos++;
|
|
2205
|
-
});
|
|
2206
|
-
}
|
|
2207
|
-
switch (tipo) {
|
|
2208
|
-
case 'checked':
|
|
2209
|
-
return (cantActivo == totalHijos);
|
|
2210
|
-
case 'indeterminate':
|
|
2211
|
-
if (cantActivo == totalHijos) {
|
|
2212
|
-
this.chkLista.setState(checkActual[this.campoId], true);
|
|
2213
|
-
}
|
|
2214
|
-
return ((cantActivo > 0) && (cantActivo != totalHijos));
|
|
2215
|
-
}
|
|
2216
|
-
return false;
|
|
2217
|
-
}
|
|
2218
|
-
classFila2(item) {
|
|
2219
|
-
let clases = [];
|
|
2220
|
-
if (this.campoAnulado && item[this.campoAnulado] === 1) {
|
|
2221
|
-
clases = clases.concat(this.classAnulado);
|
|
2222
|
-
}
|
|
2223
|
-
if (item?.seleccionado) {
|
|
2224
|
-
clases = clases.concat(this.classSeleccionado);
|
|
2225
|
-
}
|
|
2226
|
-
clases = clases.concat(this.condicionesClaseFila(item));
|
|
2227
|
-
item.claseFinal = clases;
|
|
2228
|
-
return clases;
|
|
2229
|
-
}
|
|
2230
|
-
classFila(item) {
|
|
2231
|
-
let claseFinal = [];
|
|
2232
|
-
if (this.campoAnulado && (item[this.campoAnulado] == 1)) {
|
|
2233
|
-
claseFinal = claseFinal.concat(this.classAnulado);
|
|
2234
|
-
}
|
|
2235
|
-
if (this.objSeleccionado == item || this.esSeleccionActual(item)) {
|
|
2236
|
-
claseFinal = claseFinal.concat(this.classSeleccionado);
|
|
2237
|
-
}
|
|
2238
|
-
claseFinal = claseFinal.concat(this.condicionesClaseFila(item));
|
|
2239
|
-
item.claseFinal = claseFinal;
|
|
2240
|
-
return claseFinal;
|
|
2241
|
-
}
|
|
2242
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ListaArbolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2243
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ListaArbolComponent, isStandalone: true, selector: "jvs-lista-arbol", inputs: { listaSuscription: "listaSuscription", nombreColeccion: "nombreColeccion", checkbox: "checkbox", expandirRecursivo: "expandirRecursivo", checkboxSeleccionados: "checkboxSeleccionados", campoId: "campoId", campoIdPadre: "campoIdPadre", campoStr: "campoStr", strHijoContainer: "strHijoContainer", menuContextual: "menuContextual", classSeleccionado: "classSeleccionado", classAnulado: "classAnulado", campoAnulado: "campoAnulado", templateTxtData: "templateTxtData", condicionMostrar: "condicionMostrar", condicionesClaseFila: "condicionesClaseFila", selectionModel: "selectionModel", idTabla: "idTabla" }, outputs: { selectionModelChange: "selectionModelChange", seleccionado: "seleccionado", listaCheck: "listaCheck", listaCheckObj: "listaCheckObj" }, ngImport: i0, template: "<mat-tree [dataSource]=\"listaMuestraArbol\" [treeControl]=\"treeControl\">\n <mat-tree-node class=\"!pl-0 min-h-0\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </mat-tree-node>\n\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion, tipo: 'ver', item: node }); menuContextual?.cerrarMenuContextual();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [checked]=\"nested ? hijosActivos('checked', node) : false\"\n [indeterminate]=\"nested ? hijosActivos('indeterminate', node) : false\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData\" class=\"w-full\">{{ node[campoStr] }}</span>\n <ng-container *ngIf=\"templateTxtData\" [ngTemplateOutlet]=\"templateTxtData\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i3$2.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], outputs: ["activation", "expandedChange"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i3$2.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i3$2.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i3$2.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }] });
|
|
2244
|
-
}
|
|
2245
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ListaArbolComponent, decorators: [{
|
|
2246
|
-
type: Component,
|
|
2247
|
-
args: [{ selector: 'jvs-lista-arbol', standalone: true, imports: [
|
|
2248
|
-
CommonModule,
|
|
2249
|
-
FormsModule,
|
|
2250
|
-
MatTreeModule,
|
|
2251
|
-
MatIconModule,
|
|
2252
|
-
MatCheckboxModule,
|
|
2253
|
-
], template: "<mat-tree [dataSource]=\"listaMuestraArbol\" [treeControl]=\"treeControl\">\n <mat-tree-node class=\"!pl-0 min-h-0\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </mat-tree-node>\n\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion, tipo: 'ver', item: node }); menuContextual?.cerrarMenuContextual();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [checked]=\"nested ? hijosActivos('checked', node) : false\"\n [indeterminate]=\"nested ? hijosActivos('indeterminate', node) : false\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData\" class=\"w-full\">{{ node[campoStr] }}</span>\n <ng-container *ngIf=\"templateTxtData\" [ngTemplateOutlet]=\"templateTxtData\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n" }]
|
|
2254
|
-
}], propDecorators: { listaSuscription: [{
|
|
2255
|
-
type: Input
|
|
2256
|
-
}], nombreColeccion: [{
|
|
2257
|
-
type: Input
|
|
2258
|
-
}], checkbox: [{
|
|
2259
|
-
type: Input
|
|
2260
|
-
}], expandirRecursivo: [{
|
|
2261
|
-
type: Input
|
|
2262
|
-
}], checkboxSeleccionados: [{
|
|
2263
|
-
type: Input
|
|
2264
|
-
}], campoId: [{
|
|
2265
|
-
type: Input
|
|
2266
|
-
}], campoIdPadre: [{
|
|
2267
|
-
type: Input
|
|
2268
|
-
}], campoStr: [{
|
|
2269
|
-
type: Input
|
|
2270
|
-
}], strHijoContainer: [{
|
|
2271
|
-
type: Input
|
|
2272
|
-
}], menuContextual: [{
|
|
2273
|
-
type: Input
|
|
2274
|
-
}], classSeleccionado: [{
|
|
2275
|
-
type: Input
|
|
2276
|
-
}], classAnulado: [{
|
|
2277
|
-
type: Input
|
|
2278
|
-
}], campoAnulado: [{
|
|
2279
|
-
type: Input
|
|
2280
|
-
}], templateTxtData: [{
|
|
2281
|
-
type: Input
|
|
2282
|
-
}], condicionMostrar: [{
|
|
2283
|
-
type: Input
|
|
2284
|
-
}], condicionesClaseFila: [{
|
|
2285
|
-
type: Input
|
|
2286
|
-
}], selectionModel: [{
|
|
2287
|
-
type: Input
|
|
2288
|
-
}], selectionModelChange: [{
|
|
2289
|
-
type: Output
|
|
2290
|
-
}], seleccionado: [{
|
|
2291
|
-
type: Output
|
|
2292
|
-
}], listaCheck: [{
|
|
2293
|
-
type: Output
|
|
2294
|
-
}], listaCheckObj: [{
|
|
2295
|
-
type: Output
|
|
2296
|
-
}], idTabla: [{
|
|
2297
|
-
type: Input,
|
|
2298
|
-
args: [{ required: true }]
|
|
2299
|
-
}] } });
|
|
2300
|
-
|
|
2301
|
-
// export {};
|
|
2302
|
-
// import './src/styles.scss';
|
|
2303
|
-
|
|
2304
|
-
/**
|
|
2305
|
-
* Generated bundle index. Do not edit.
|
|
2306
|
-
*/
|
|
2307
|
-
|
|
2308
|
-
export { DialogFlotanteComponent, ListaArbolComponent, LucesNavidadComponent, MatSuffixSearchButtonComponent, MenuComponent, ProgressBarComponent, TablaMantenimientoComponent, TablaMantenimientoService };
|
|
2309
|
-
//# sourceMappingURL=jvsoft-components.mjs.map
|