@jvsoft/components 0.0.13-alpha.0 → 0.0.13-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dialog-flotante/dialog-flotante.component.d.ts +32 -0
- package/dialog-flotante/dialog-flotante.interface.d.ts +11 -0
- package/dialog-flotante/index.d.ts +5 -0
- package/fesm2022/jvsoft-components-dialog-flotante.mjs +129 -0
- package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +1 -0
- package/fesm2022/jvsoft-components-lista-arbol.mjs +294 -0
- package/fesm2022/jvsoft-components-lista-arbol.mjs.map +1 -0
- package/fesm2022/jvsoft-components-luces-navidad.mjs +33 -0
- package/fesm2022/jvsoft-components-luces-navidad.mjs.map +1 -0
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +47 -0
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +1 -0
- package/fesm2022/jvsoft-components-menu.mjs +102 -0
- package/fesm2022/jvsoft-components-menu.mjs.map +1 -0
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +91 -0
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +1 -0
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +1798 -0
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +1 -0
- package/fesm2022/jvsoft-components.mjs +2333 -0
- package/fesm2022/jvsoft-components.mjs.map +1 -0
- package/{index.ts → index.d.ts} +1 -8
- package/lista-arbol/index.d.ts +5 -0
- package/lista-arbol/lista-arbol.component.d.ts +59 -0
- package/lista-arbol/lista-arbol.functions.d.ts +8 -0
- package/luces-navidad/index.d.ts +5 -0
- package/luces-navidad/luces-navidad.component.d.ts +11 -0
- package/mat-suffix-search-button/index.d.ts +5 -0
- package/mat-suffix-search-button/mat-suffix-search-button.component.d.ts +12 -0
- package/menu/index.d.ts +5 -0
- package/menu/menu.component.d.ts +25 -0
- package/menu/menu.interface.d.ts +16 -0
- package/package.json +45 -13
- package/src/styles/base-jvsoft-components.css +9 -0
- package/tabla-mantenimiento/classes/data-model.d.ts +25 -0
- package/tabla-mantenimiento/components/progress-bar/index.d.ts +5 -0
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.d.ts +30 -0
- package/tabla-mantenimiento/components/progress-bar/public-api.d.ts +1 -0
- package/tabla-mantenimiento/index.d.ts +5 -0
- package/tabla-mantenimiento/interfaces/{archivo.ts → archivo.d.ts} +4 -7
- package/tabla-mantenimiento/interfaces/global/{boton-mantenimiento.ts → boton-mantenimiento.d.ts} +3 -9
- package/tabla-mantenimiento/interfaces/global/{columnas-tabla.ts → columnas-tabla.d.ts} +12 -89
- package/tabla-mantenimiento/interfaces/global/no-export.d.ts +2 -0
- package/tabla-mantenimiento/interfaces/global/{otros.ts → otros.d.ts} +3 -15
- package/tabla-mantenimiento/interfaces/implements/{incluye-tabla-mantenimiento.ts → incluye-tabla-mantenimiento.d.ts} +4 -6
- package/tabla-mantenimiento/interfaces/implements/{index.ts → index.d.ts} +0 -1
- package/tabla-mantenimiento/mat-row-keyboard-selection.directive.d.ts +19 -0
- package/tabla-mantenimiento/pipes/no-sanitize.pipe.d.ts +10 -0
- package/tabla-mantenimiento/pipes/zero-fill.pipe.d.ts +8 -0
- package/tabla-mantenimiento/{public-api.ts → public-api.d.ts} +2 -3
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.d.ts +8 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.d.ts +9 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.d.ts +9 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.d.ts +8 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.d.ts +8 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.d.ts +9 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.d.ts +8 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.d.ts +18 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts +23 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.d.ts +21 -0
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.d.ts +18 -0
- package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +147 -0
- package/tabla-mantenimiento/tabla-mantenimiento.functions.d.ts +5 -0
- package/tabla-mantenimiento/tabla-mantenimiento.service.d.ts +8 -0
- package/tabla-mantenimiento/table-util.d.ts +11 -0
- package/CHANGELOG.md +0 -26
- package/build.js +0 -20
- package/dialog-flotante/dialog-flotante.component.html +0 -66
- package/dialog-flotante/dialog-flotante.component.ts +0 -115
- package/dialog-flotante/dialog-flotante.interface.ts +0 -13
- package/dialog-flotante/index.ts +0 -1
- package/dialog-flotante/ng-package.json +0 -5
- package/lista-arbol/lista-arbol.component.html +0 -66
- package/lista-arbol/lista-arbol.component.ts +0 -238
- package/lista-arbol/lista-arbol.functions.ts +0 -46
- package/lista-arbol/ng-package.json +0 -5
- package/luces-navidad/christmas-tree.png +0 -0
- package/luces-navidad/index.ts +0 -1
- package/luces-navidad/luces-navidad.component.html +0 -6
- package/luces-navidad/luces-navidad.component.ts +0 -24
- package/luces-navidad/ng-package.json +0 -5
- package/mat-suffix-search-button/index.ts +0 -1
- package/mat-suffix-search-button/mat-suffix-search-button.component.html +0 -5
- package/mat-suffix-search-button/mat-suffix-search-button.component.ts +0 -36
- package/mat-suffix-search-button/ng-package.json +0 -5
- package/menu/index.ts +0 -1
- package/menu/menu.component.html +0 -40
- package/menu/menu.component.ts +0 -88
- package/menu/menu.interface.ts +0 -16
- package/menu/ng-package.json +0 -5
- package/ng-package.json +0 -17
- package/progress-spinner.zip +0 -0
- package/tabla-mantenimiento/classes/data-model.ts +0 -150
- package/tabla-mantenimiento/components/progress-bar/index.ts +0 -1
- package/tabla-mantenimiento/components/progress-bar/ng-package.json +0 -5
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.html +0 -10
- package/tabla-mantenimiento/components/progress-bar/progress-bar.component.ts +0 -85
- package/tabla-mantenimiento/components/progress-bar/public-api.ts +0 -2
- package/tabla-mantenimiento/index.ts +0 -1
- package/tabla-mantenimiento/interfaces/global/export-excel-servidor.ts +0 -0
- package/tabla-mantenimiento/interfaces/global/no-export.ts +0 -11
- package/tabla-mantenimiento/mat-row-keyboard-selection.directive.ts +0 -97
- package/tabla-mantenimiento/ng-package.json +0 -5
- package/tabla-mantenimiento/pipes/no-sanitize.pipe.ts +0 -12
- package/tabla-mantenimiento/pipes/zero-fill.pipe.ts +0 -19
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.html +0 -22
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.ts +0 -12
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.html +0 -58
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.ts +0 -19
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.html +0 -40
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.ts +0 -17
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.html +0 -25
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.ts +0 -14
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.html +0 -28
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.ts +0 -13
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.html +0 -30
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.ts +0 -38
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.html +0 -97
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.ts +0 -43
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.html +0 -26
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.ts +0 -36
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.ts +0 -54
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.html +0 -76
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.ts +0 -67
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.html +0 -7
- package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.ts +0 -39
- package/tabla-mantenimiento/tabla-mantenimiento.component.html +0 -385
- package/tabla-mantenimiento/tabla-mantenimiento.component.ts +0 -951
- package/tabla-mantenimiento/tabla-mantenimiento.functions.ts +0 -57
- package/tabla-mantenimiento/tabla-mantenimiento.service.ts +0 -44
- package/tabla-mantenimiento/table-util.ts +0 -49
- package/tabla-mantenimiento.zip +0 -0
- package/tsconfig.lib.json +0 -16
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -15
- package/yarn-error.log +0 -68
- /package/dialog-flotante/{public-api.ts → public-api.d.ts} +0 -0
- /package/lista-arbol/{public-api.ts → public-api.d.ts} +0 -0
- /package/luces-navidad/{public-api.ts → public-api.d.ts} +0 -0
- /package/mat-suffix-search-button/{public-api.ts → public-api.d.ts} +0 -0
- /package/menu/{public-api.ts → public-api.d.ts} +0 -0
- /package/tabla-mantenimiento/interfaces/global/{index.ts → index.d.ts} +0 -0
- /package/tabla-mantenimiento/interfaces/{index.ts → index.d.ts} +0 -0
package/menu/menu.component.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, QueryList, ViewChildren} from '@angular/core';
|
|
2
|
-
import {CommonModule} from '@angular/common';
|
|
3
|
-
import {MatMenu, MatMenuModule} from '@angular/material/menu';
|
|
4
|
-
import {MatIconModule} from '@angular/material/icon';
|
|
5
|
-
import {MatRippleModule} from '@angular/material/core';
|
|
6
|
-
import {MatTooltipModule} from '@angular/material/tooltip';
|
|
7
|
-
import {BotonMenu} from './menu.interface';
|
|
8
|
-
|
|
9
|
-
@Component({
|
|
10
|
-
selector: 'jvs-menu',
|
|
11
|
-
standalone: true,
|
|
12
|
-
imports: [
|
|
13
|
-
CommonModule,
|
|
14
|
-
MatMenuModule,
|
|
15
|
-
MatIconModule,
|
|
16
|
-
MatRippleModule,
|
|
17
|
-
MatTooltipModule,
|
|
18
|
-
],
|
|
19
|
-
templateUrl: './menu.component.html',
|
|
20
|
-
})
|
|
21
|
-
export class MenuComponent implements OnInit, AfterViewInit {
|
|
22
|
-
@Input() cssBoton?: string;
|
|
23
|
-
@Input() title?: string;
|
|
24
|
-
@Input() disabled: boolean = false;
|
|
25
|
-
@Input() itemSeleccion?: string;
|
|
26
|
-
@Input() menu: BotonMenu[] = [];
|
|
27
|
-
@Output() action: EventEmitter<string> = new EventEmitter<string>();
|
|
28
|
-
|
|
29
|
-
@ViewChildren(MatMenu) matmenus!: QueryList<MatMenu>;
|
|
30
|
-
|
|
31
|
-
menuItems: string[] = [];
|
|
32
|
-
yet: boolean = false;
|
|
33
|
-
_submenus: BotonMenu[][] = []; // 🔥 Tipo explícito como Array de Array de BotonMenu
|
|
34
|
-
|
|
35
|
-
get submenus(): BotonMenu[][] {
|
|
36
|
-
return this._submenus.filter(() => true); // Mantiene la estructura, aunque no hace filtro real
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
ngOnInit(): void {
|
|
40
|
-
this.createSubmenus(this.menu, 's0', 1);
|
|
41
|
-
this.reindex();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
ngAfterViewInit(): void {
|
|
45
|
-
// Previene errores de Angular al repintar el menú
|
|
46
|
-
setTimeout(() => {
|
|
47
|
-
this.yet = true;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
onClick(value: string): void {
|
|
52
|
-
this.action.emit(value);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
getMenu(index: number): MatMenu | null {
|
|
56
|
-
return index >= 0 && this.matmenus ? this.matmenus.get(index) ?? null:null;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
reindex(): void {
|
|
60
|
-
// Asigna el índice del ítem del menú
|
|
61
|
-
this._submenus.forEach((menu: BotonMenu[]) => {
|
|
62
|
-
menu.forEach((item: BotonMenu) => {
|
|
63
|
-
if (item.idxOpcionCalc !== -1) {
|
|
64
|
-
item.idxOpcionCalc = this.menuItems.indexOf(item.valorSeleccion ?? '');
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
createSubmenus(menu: BotonMenu[], prefix: string, count: number): void {
|
|
71
|
-
this.menuItems.push(prefix);
|
|
72
|
-
|
|
73
|
-
this._submenus.push(
|
|
74
|
-
menu.map((item, index): BotonMenu => ({
|
|
75
|
-
...item,
|
|
76
|
-
valorSeleccion: item.subItems ? `${prefix}${index}`:item.valorSeleccion,
|
|
77
|
-
idxOpcionCalc: item.subItems ? 0:-1,
|
|
78
|
-
}))
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
// Llamada recursiva para crear submenús
|
|
82
|
-
menu.forEach((item, index) => {
|
|
83
|
-
if (item.subItems) {
|
|
84
|
-
this.createSubmenus(item.subItems, `${prefix}${index}`, count + 1);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
package/menu/menu.interface.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface BotonMenu {
|
|
2
|
-
idUnico?: string,
|
|
3
|
-
class?: string;
|
|
4
|
-
icono?: string;
|
|
5
|
-
label?: string;
|
|
6
|
-
soloIcono?: boolean;
|
|
7
|
-
sinCondicion?: boolean;
|
|
8
|
-
badge?: string;
|
|
9
|
-
tooltip?: string;
|
|
10
|
-
idxOpcionCalc?: any,
|
|
11
|
-
subItems?: BotonMenu[];
|
|
12
|
-
datosExtra?: any;
|
|
13
|
-
valorSeleccion?: any;
|
|
14
|
-
esVisible?(dataValid?: any): boolean;
|
|
15
|
-
estaDeshabilitado?(item?: any): boolean;
|
|
16
|
-
}
|
package/menu/ng-package.json
DELETED
package/ng-package.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
|
3
|
-
"dest": "../../dist/components",
|
|
4
|
-
"lib": {
|
|
5
|
-
"entryFile": "./index.ts",
|
|
6
|
-
"styleIncludePaths": [
|
|
7
|
-
"./src"
|
|
8
|
-
]
|
|
9
|
-
},
|
|
10
|
-
"assets": [
|
|
11
|
-
"**/*.scss",
|
|
12
|
-
"**/*.css"
|
|
13
|
-
],
|
|
14
|
-
"allowedNonPeerDependencies": [
|
|
15
|
-
"."
|
|
16
|
-
]
|
|
17
|
-
}
|
package/progress-spinner.zip
DELETED
|
Binary file
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import {AbstractControl, FormControl, FormControlOptions, FormGroup, ValidationErrors, ValidatorFn, Validators} from '@angular/forms';
|
|
2
|
-
import {esNumero} from '../tabla-mantenimiento.functions';
|
|
3
|
-
|
|
4
|
-
export class DataModel {
|
|
5
|
-
public modelosChk: { [key: string]: boolean | any } = {}; // Usar any para valores dinámicos
|
|
6
|
-
|
|
7
|
-
public checkbox: ForCheckboxModel;
|
|
8
|
-
|
|
9
|
-
constructor() {
|
|
10
|
-
this.checkbox = new ForCheckboxModel(this);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
generarId(row: any, campoValor: string[] | string, separador = '') {
|
|
14
|
-
if (typeof campoValor == 'string') {
|
|
15
|
-
campoValor = [campoValor];
|
|
16
|
-
}
|
|
17
|
-
return campoValor.map(data => row[data]).join(separador);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Agrega controles al objeto modelosChk
|
|
21
|
-
agregarControles(lista: any[], idLista: string, limpiar = true, campoValor: string[] | string | null = null, campoValorSeparador = '') {
|
|
22
|
-
|
|
23
|
-
if (limpiar) {
|
|
24
|
-
this.modelosChk = {};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const asignarValor = (dat: any, idLista: string, campoValor: string, key?: string) => {
|
|
28
|
-
if (!key) {
|
|
29
|
-
key = dat[idLista] + (campoValor.includes('.') ? '':`.${campoValor}`);
|
|
30
|
-
}
|
|
31
|
-
const mat = campoValor.match(/^([in])[A-Z][a-zA-Z]+/);
|
|
32
|
-
if (mat) {
|
|
33
|
-
this.modelosChk[key] = dat[campoValor] * 1;
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
this.modelosChk[key] = dat[campoValor];
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
lista.forEach(dat => {
|
|
42
|
-
if (campoValor === null) {
|
|
43
|
-
// Caso 1: Sin campoValor, se asigna false
|
|
44
|
-
this.modelosChk[dat[idLista]] = false;
|
|
45
|
-
}
|
|
46
|
-
else if (typeof campoValor === 'string') {
|
|
47
|
-
// Caso 2: campoValor es un string
|
|
48
|
-
asignarValor(dat, idLista, campoValor, dat[idLista]);
|
|
49
|
-
}
|
|
50
|
-
else if (campoValorSeparador) {
|
|
51
|
-
const idStr = this.generarId(dat, campoValor, campoValorSeparador);
|
|
52
|
-
// Caso 2: campoValor es un string
|
|
53
|
-
asignarValor(dat, idLista, '.', idStr);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
// Caso 3: campoValor es un array de strings
|
|
57
|
-
campoValor.forEach(data => asignarValor(dat, idLista, data));
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Establece el estado de un índice
|
|
63
|
-
setState(idx: string, state: boolean) {
|
|
64
|
-
this.modelosChk[idx] = state;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Obtiene el estado de un índice
|
|
68
|
-
getState(idx: string): boolean | any {
|
|
69
|
-
return this.modelosChk[idx];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
getDataMultiple(idx: string) {
|
|
73
|
-
const camposMod = Object.keys(this.modelosChk).filter(key => key.split('.')[0] == idx);
|
|
74
|
-
const vRet: any = {};
|
|
75
|
-
camposMod.forEach(key => {
|
|
76
|
-
vRet[key.split('.')[1]] = this.modelosChk[key];
|
|
77
|
-
});
|
|
78
|
-
return vRet;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Genera una lista basada en el estado de los índices
|
|
82
|
-
generarLista(tipoRetorno: 'array' | 'object' | null = null, esCampoNumerico = false): string | object | any[] {
|
|
83
|
-
const strLista: string[] = [];
|
|
84
|
-
const objLista: { [key: string]: boolean | any } = {};
|
|
85
|
-
Object.keys(this.modelosChk).forEach(key => {
|
|
86
|
-
if ((esCampoNumerico && esNumero(this.modelosChk[key])) ||
|
|
87
|
-
(this.modelosChk[key])
|
|
88
|
-
) {
|
|
89
|
-
strLista.push(key);
|
|
90
|
-
objLista[key] = this.modelosChk[key];
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
if (tipoRetorno === 'array') {
|
|
94
|
-
return strLista;
|
|
95
|
-
}
|
|
96
|
-
if (tipoRetorno === 'object') {
|
|
97
|
-
return objLista;
|
|
98
|
-
}
|
|
99
|
-
return strLista.join(',');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
generarFormGroupFromModelosChk(tipo?: string): FormGroup {
|
|
103
|
-
const formGroupObj: { [key: string]: FormControl } = {};
|
|
104
|
-
let validadores: ValidatorFn | ((control: AbstractControl) => ValidationErrors | null)[] | FormControlOptions | null | undefined = []
|
|
105
|
-
if (tipo == 'number') {
|
|
106
|
-
validadores = [
|
|
107
|
-
Validators.required,
|
|
108
|
-
Validators.min(1)
|
|
109
|
-
]
|
|
110
|
-
}
|
|
111
|
-
Object.keys(this.modelosChk).forEach(key => {
|
|
112
|
-
formGroupObj[key] = new FormControl(this.modelosChk[key], validadores);
|
|
113
|
-
});
|
|
114
|
-
return new FormGroup(formGroupObj);
|
|
115
|
-
|
|
116
|
-
// return this.formBuilder.group(formGroupObj);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
class ForCheckboxModel {
|
|
121
|
-
private modeloCheck: DataModel;
|
|
122
|
-
|
|
123
|
-
constructor(modeloCheck: DataModel) {
|
|
124
|
-
this.modeloCheck = modeloCheck;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
get cantidadActivos() {
|
|
128
|
-
return Object.values(this.modeloCheck.modelosChk).filter(Boolean).length;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
get existenActivados() {
|
|
132
|
-
return this.cantidadActivos > 0;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
get todosActivos() {
|
|
136
|
-
const total = Object.keys(this.modeloCheck.modelosChk).length;
|
|
137
|
-
const activos = this.cantidadActivos;
|
|
138
|
-
return activos > 0 && total === activos;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
get algunosActivos() {
|
|
142
|
-
const total = Object.keys(this.modeloCheck.modelosChk).length;
|
|
143
|
-
const activos = this.cantidadActivos;
|
|
144
|
-
return activos > 0 && total !== activos;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
establecerTodos(activo: boolean) {
|
|
148
|
-
Object.keys(this.modeloCheck.modelosChk).forEach(idx => this.modeloCheck.modelosChk[idx] = activo);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './public-api'
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
<div class="w-full bg-gray-200 text-gray-700 rounded-full" [class.text-center]="textoCentrado">
|
|
2
|
-
<div class="text-xxs font-medium text-center p-1 leading-none rounded-full"
|
|
3
|
-
[ngClass]="colorEstilo().class ? colorEstilo().class : 'bg-blue-600 text-blue-100'"
|
|
4
|
-
[style]="colorEstilo().style ? colorEstilo().style : ''"
|
|
5
|
-
[style.width]="(textoCentrado ? 100 : porcentaje) + '%'"
|
|
6
|
-
>
|
|
7
|
-
<span *ngIf="textoMostrar else defaultText;" class="whitespace-nowrap">{{ textoMostrar }}</span>
|
|
8
|
-
<ng-template #defaultText>{{ porcentaje | number: formatoNumero }}%</ng-template>
|
|
9
|
-
</div>
|
|
10
|
-
</div>
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import {Component, Input, OnInit} from '@angular/core';
|
|
2
|
-
import {CommonModule, DecimalPipe} from '@angular/common';
|
|
3
|
-
|
|
4
|
-
export interface EstilosBarra {
|
|
5
|
-
valorMaximo: number;
|
|
6
|
-
class?: string;
|
|
7
|
-
style?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
@Component({
|
|
11
|
-
selector: 'jvs-progress-bar',
|
|
12
|
-
templateUrl: './progress-bar.component.html',
|
|
13
|
-
imports: [
|
|
14
|
-
CommonModule,
|
|
15
|
-
DecimalPipe
|
|
16
|
-
],
|
|
17
|
-
host: {
|
|
18
|
-
class: 'jvs-progress-bar',
|
|
19
|
-
}
|
|
20
|
-
})
|
|
21
|
-
export class ProgressBarComponent implements OnInit {
|
|
22
|
-
|
|
23
|
-
@Input() objThis: any;
|
|
24
|
-
@Input() porcentaje = 0;
|
|
25
|
-
@Input() textoCentrado = false;
|
|
26
|
-
|
|
27
|
-
private _textoMostrar: string = '';
|
|
28
|
-
get textoMostrar(): string { return this._textoMostrar; }
|
|
29
|
-
@Input() set textoMostrar(val: string) { this._textoMostrar = val; }
|
|
30
|
-
|
|
31
|
-
private _formatoNumero: string = '';
|
|
32
|
-
get formatoNumero(): string { return this._formatoNumero; }
|
|
33
|
-
@Input() set formatoNumero(val: string | undefined) { this._formatoNumero = val ?? '1.0-0'; }
|
|
34
|
-
|
|
35
|
-
private _coloresValor: EstilosBarra[] = [];
|
|
36
|
-
get coloresValor(): EstilosBarra[] { return this._coloresValor; }
|
|
37
|
-
@Input() set coloresValor(val: EstilosBarra[] | undefined ) {
|
|
38
|
-
if (!val || !Array.isArray(val)) {
|
|
39
|
-
this._coloresValor = [
|
|
40
|
-
{valorMaximo: 1, class: 'p-0'},
|
|
41
|
-
{valorMaximo: 40, class: 'bg-red-400 text-red-900'},
|
|
42
|
-
// {valorMaximo: 35, class: 'bg-red-600 text-red-100'},
|
|
43
|
-
{valorMaximo: 80, class: 'bg-yellow-600 text-yellow-100'},
|
|
44
|
-
{valorMaximo: 100, class: 'bg-green-600 text-green-100'},
|
|
45
|
-
];
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
this._coloresValor = val;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
constructor() { }
|
|
53
|
-
|
|
54
|
-
ngOnInit(): void {
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
colorEstilo(): {style: string, class: string} {
|
|
58
|
-
let estiloFin = null;
|
|
59
|
-
let claseFin = null;
|
|
60
|
-
let encontro = false;
|
|
61
|
-
|
|
62
|
-
this.coloresValor = this.ordenarPorPropiedad(this.coloresValor, 'valorMaximo');
|
|
63
|
-
|
|
64
|
-
this.coloresValor.forEach(estilo => {
|
|
65
|
-
if (!encontro && (this.porcentaje <= estilo.valorMaximo)) {
|
|
66
|
-
// console.log(this.porcentaje, estilo, (this.porcentaje < estilo.valorMaximo));
|
|
67
|
-
encontro = true;
|
|
68
|
-
estiloFin = estilo.style;
|
|
69
|
-
claseFin = estilo.class;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
return {
|
|
73
|
-
style: estiloFin ?? '',
|
|
74
|
-
class: claseFin ?? '',
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
ordenarPorPropiedad(objData: any[], propiedad: string, numeros = false) {
|
|
79
|
-
if (numeros) {
|
|
80
|
-
return objData.sort((a, b) => a[propiedad] - b[propiedad]);
|
|
81
|
-
}
|
|
82
|
-
return objData.sort((a, b) => (a[propiedad] > b[propiedad]) ? 1:((b[propiedad] > a[propiedad]) ? -1:0));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './public-api'
|
|
File without changes
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export type TipoValorFuncion<T> = T | ((...param: any) => T);
|
|
2
|
-
|
|
3
|
-
export function tipoValorFuncion<T>(datoParam: TipoValorFuncion<T>, defaultValue?: T, ...param: any[]): T | undefined {
|
|
4
|
-
if (datoParam === undefined || datoParam === null) {
|
|
5
|
-
return defaultValue; // Retorna el valor por defecto si es undefined
|
|
6
|
-
}
|
|
7
|
-
if (typeof datoParam === 'function') {
|
|
8
|
-
return (datoParam as (...args: any) => T)(...param);
|
|
9
|
-
}
|
|
10
|
-
return datoParam;
|
|
11
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import {Directive, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output} from '@angular/core';
|
|
2
|
-
import {MatTable, MatTableDataSource} from '@angular/material/table';
|
|
3
|
-
import {Subject, takeUntil} from 'rxjs';
|
|
4
|
-
|
|
5
|
-
@Directive({
|
|
6
|
-
selector: '[matRowKeyboardSelection]'
|
|
7
|
-
})
|
|
8
|
-
export class MatRowKeyboardSelectionDirective implements OnInit, OnDestroy {
|
|
9
|
-
|
|
10
|
-
private rows!: HTMLElement[];
|
|
11
|
-
private renderedData!: any[];
|
|
12
|
-
|
|
13
|
-
@Input('matRowKeyboardSelection') tabla!: MatTable<any>; // Entrada: Referencia a la tabla
|
|
14
|
-
@Input() rowModel: any; // Entrada: Modelo de fila actual
|
|
15
|
-
@Output() seleccionarSiguiente = new EventEmitter(); // Salida: Evento al seleccionar siguiente
|
|
16
|
-
|
|
17
|
-
private unsubscriber$ = new Subject();
|
|
18
|
-
|
|
19
|
-
constructor(private el: ElementRef) {}
|
|
20
|
-
|
|
21
|
-
ngOnInit(): void {
|
|
22
|
-
// Asignar tabindex si no está definido
|
|
23
|
-
if (this.el.nativeElement.tabIndex < 0) {
|
|
24
|
-
this.el.nativeElement.tabIndex = 0;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Obtener la fuente de datos de la tabla
|
|
28
|
-
const dataSource = this.tabla.dataSource as MatTableDataSource<any>;
|
|
29
|
-
|
|
30
|
-
// Suscribirse a los cambios en los datos
|
|
31
|
-
dataSource.connect().pipe(takeUntil(this.unsubscriber$)).subscribe(data => {
|
|
32
|
-
this.renderedData = data;
|
|
33
|
-
this.rows = Array.from(<NodeListOf<HTMLElement>>this.getTableRows());
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
ngOnDestroy(): void {
|
|
38
|
-
// Finalizar la suscripción al destruir la directiva
|
|
39
|
-
this.unsubscriber$.next(null);
|
|
40
|
-
this.unsubscriber$.complete();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@HostListener('keydown', ['$event']) onKeydown(event: KeyboardEvent): void {
|
|
44
|
-
var element = event.target as HTMLElement;
|
|
45
|
-
if (element.tagName === "INPUT") {
|
|
46
|
-
event.stopPropagation();
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
const currentIndex = this.renderedData.findIndex(row => row === this.rowModel);
|
|
50
|
-
const eRef = event.target as HTMLElement;
|
|
51
|
-
this.rows = this.rows.filter(elem => elem.hasAttribute('id'));
|
|
52
|
-
const arrayFilas = Array.from(this.rows);
|
|
53
|
-
|
|
54
|
-
const fElem = arrayFilas.filter(elem => elem.id == eRef.id).pop();
|
|
55
|
-
const cElemIdx = arrayFilas.findIndex(elem => elem == fElem);
|
|
56
|
-
|
|
57
|
-
let newRow: HTMLElement | undefined;
|
|
58
|
-
|
|
59
|
-
// Controlar las teclas presionadas
|
|
60
|
-
switch (event.key) {
|
|
61
|
-
case 'ArrowDown':
|
|
62
|
-
newRow = this.rows[cElemIdx + 1];
|
|
63
|
-
break;
|
|
64
|
-
case 'ArrowUp':
|
|
65
|
-
newRow = this.rows[cElemIdx - 1];
|
|
66
|
-
break;
|
|
67
|
-
case 'Enter':
|
|
68
|
-
case ' ':
|
|
69
|
-
this.seleccionarSiguiente.next(this.renderedData[currentIndex]);
|
|
70
|
-
event.preventDefault();
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Enfocar la nueva fila seleccionada
|
|
75
|
-
if (newRow) {
|
|
76
|
-
newRow.classList.add('estaFocus');
|
|
77
|
-
newRow.focus();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
private getTableRows(): NodeListOf<HTMLElement> | undefined {
|
|
83
|
-
let el = this.el.nativeElement;
|
|
84
|
-
|
|
85
|
-
// Recorrer los elementos padres hasta encontrar la tabla
|
|
86
|
-
while (el && el.parentNode) {
|
|
87
|
-
el = el.parentNode;
|
|
88
|
-
|
|
89
|
-
// Verificar si es una tabla de material
|
|
90
|
-
if (el.tagName && el.tagName.toLowerCase() === 'mat-table' || el.hasAttribute('mat-table')) {
|
|
91
|
-
return el.querySelectorAll('mat-row, tr[mat-row]');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {Pipe, PipeTransform} from '@angular/core';
|
|
2
|
-
import {DomSanitizer, SafeHtml} from '@angular/platform-browser';
|
|
3
|
-
|
|
4
|
-
@Pipe({ name: 'noSanitize' })
|
|
5
|
-
export class NoSanitizePipe implements PipeTransform {
|
|
6
|
-
constructor(private domSanitizer: DomSanitizer) {
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
transform(html: string): SafeHtml {
|
|
10
|
-
return this.domSanitizer.bypassSecurityTrustHtml(html);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {Pipe, PipeTransform} from '@angular/core';
|
|
2
|
-
|
|
3
|
-
@Pipe({
|
|
4
|
-
name: 'zeroFill',
|
|
5
|
-
})
|
|
6
|
-
export class ZeroFillPipe implements PipeTransform {
|
|
7
|
-
|
|
8
|
-
transform(value: unknown, digitos: number, ...args: unknown[]) {
|
|
9
|
-
let s = value + '';
|
|
10
|
-
while (s.length < digitos) {
|
|
11
|
-
s = '0' + s;
|
|
12
|
-
}
|
|
13
|
-
return s;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
export function zeroFill(value: unknown, digitos: number, ...args: unknown[]) {
|
|
18
|
-
return new ZeroFillPipe().transform(value, digitos, args);
|
|
19
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
<ng-template #cellTemplate let-row="row">
|
|
2
|
-
{{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}
|
|
3
|
-
</ng-template>
|
|
4
|
-
|
|
5
|
-
<ng-container matColumnDef="{{ column.property }}">
|
|
6
|
-
<!-- Definición del encabezado de la columna -->
|
|
7
|
-
<th *matHeaderCellDef [ngClass]="column.cssClassesTH" class="uppercase text-center" mat-header-cell mat-sort-header
|
|
8
|
-
[disabled]="column.sort === false">
|
|
9
|
-
<span [innerHTML]="column.label ?? ''">{{ column.label }} </span>
|
|
10
|
-
</th>
|
|
11
|
-
|
|
12
|
-
<!-- Cuerpo de la celda, definido por los hijos -->
|
|
13
|
-
<td *matCellDef="let row" [ngClass]="column.cssClasses" mat-cell (click)="accionClick(row, $event)">
|
|
14
|
-
|
|
15
|
-
<ng-container [ngTemplateOutlet]="cellTemplate" [ngTemplateOutletContext]="{row}"></ng-container>
|
|
16
|
-
|
|
17
|
-
</td>
|
|
18
|
-
|
|
19
|
-
<th *matFooterCellDef [ngClass]="column.cssFooterClasses" mat-footer-cell>
|
|
20
|
-
{{ column.transformarFooter ? column.transformarFooter() : '' }}
|
|
21
|
-
</th>
|
|
22
|
-
</ng-container>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {Component, Input} from '@angular/core';
|
|
2
|
-
import {ColumnaDate} from '../../../interfaces';
|
|
3
|
-
import {ColumnTypeComponent} from '../column-type.component';
|
|
4
|
-
|
|
5
|
-
@Component({
|
|
6
|
-
selector: 'jvs-column-type-date',
|
|
7
|
-
standalone: false,
|
|
8
|
-
templateUrl: './column-type-date.component.html'
|
|
9
|
-
})
|
|
10
|
-
export class ColumnTypeDateComponent<T> extends ColumnTypeComponent<T> {
|
|
11
|
-
@Input({required: true}) override column: ColumnaDate<T> = {} as ColumnaDate<T>;
|
|
12
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<ng-template #cellTemplate let-row="row">
|
|
2
|
-
<div class="flex items-center justify-center" [ngClass]="{ '-space-x-1': !column.iconsDef?.soloIcono }"
|
|
3
|
-
>
|
|
4
|
-
<ng-container *ngFor="let icon of obtenerItems(column.iconsDef, row)">
|
|
5
|
-
<ng-container *ngIf="!column.iconsDef?.soloIcono; else soloIcono">
|
|
6
|
-
<button matRipple type="button" *ngIf="!icon.esVisible || icon.esVisible(row)"
|
|
7
|
-
(click)="icon.click ? icon.click(row) : false; $event.stopPropagation()"
|
|
8
|
-
class="flex items-center justify-center p-1 rounded border shadow-sm hover:shadow-lg"
|
|
9
|
-
[ngClass]="icon.contentCss"
|
|
10
|
-
[matTooltip]="icon.toolTip ?? row[icon.toolTipField ?? '_field_']"
|
|
11
|
-
[matTooltipDisabled]="!icon.toolTip && !icon.toolTipField"
|
|
12
|
-
>
|
|
13
|
-
<ng-container [ngTemplateOutlet]="iconoConTamanio"
|
|
14
|
-
[ngTemplateOutletContext]="{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}"></ng-container>
|
|
15
|
-
</button>
|
|
16
|
-
</ng-container>
|
|
17
|
-
<ng-template #soloIcono>
|
|
18
|
-
<div *ngIf="!icon.esVisible || icon.esVisible(row)" [ngClass]="icon.contentCss"
|
|
19
|
-
class="flex items-center"
|
|
20
|
-
[matTooltip]="icon.toolTip ?? row[icon.toolTipField ?? '_field_']"
|
|
21
|
-
[matTooltipDisabled]="!icon.toolTip && !icon.toolTipField"
|
|
22
|
-
>
|
|
23
|
-
<ng-container [ngTemplateOutlet]="iconoConTamanio"
|
|
24
|
-
[ngTemplateOutletContext]="{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}"></ng-container>
|
|
25
|
-
</div>
|
|
26
|
-
</ng-template>
|
|
27
|
-
</ng-container>
|
|
28
|
-
</div>
|
|
29
|
-
</ng-template>
|
|
30
|
-
|
|
31
|
-
<ng-container matColumnDef="{{ column.property }}">
|
|
32
|
-
<!-- Definición del encabezado de la columna -->
|
|
33
|
-
<th *matHeaderCellDef [ngClass]="column.cssClassesTH" class="uppercase text-center" mat-header-cell mat-sort-header
|
|
34
|
-
[disabled]="column.sort === false">
|
|
35
|
-
<span [innerHTML]="column.label ?? ''">{{ column.label }} </span>
|
|
36
|
-
</th>
|
|
37
|
-
|
|
38
|
-
<!-- Cuerpo de la celda, definido por los hijos -->
|
|
39
|
-
<td *matCellDef="let row" [ngClass]="column.cssClasses" mat-cell (click)="accionClick(row, $event)">
|
|
40
|
-
|
|
41
|
-
<ng-container [ngTemplateOutlet]="cellTemplate" [ngTemplateOutletContext]="{row}"></ng-container>
|
|
42
|
-
|
|
43
|
-
</td>
|
|
44
|
-
|
|
45
|
-
<th *matFooterCellDef [ngClass]="column.cssFooterClasses" mat-footer-cell>
|
|
46
|
-
{{ column.transformarFooter ? column.transformarFooter() : '' }}
|
|
47
|
-
</th>
|
|
48
|
-
</ng-container>
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
<ng-template #iconoConTamanio let-icon="icon" let-iconClass="iconClass" let-size="size">
|
|
52
|
-
<mat-icon *ngIf="size" [svgIcon]="icon" [ngClass]="iconClass" [inline]="true"
|
|
53
|
-
[style.font-size]="size"
|
|
54
|
-
[style.height]="size"
|
|
55
|
-
[style.width]="size"
|
|
56
|
-
></mat-icon>
|
|
57
|
-
<mat-icon *ngIf="!size" [svgIcon]="icon" [ngClass]="iconClass"></mat-icon>
|
|
58
|
-
</ng-template>
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {Component, Input} from '@angular/core';
|
|
2
|
-
import {ColumnaIcons, IconsIcon} from '../../../interfaces';
|
|
3
|
-
import {ColumnTypeComponent} from '../column-type.component';
|
|
4
|
-
|
|
5
|
-
@Component({
|
|
6
|
-
selector: 'jvs-column-type-icons',
|
|
7
|
-
standalone: false,
|
|
8
|
-
templateUrl: './column-type-icons.component.html'
|
|
9
|
-
})
|
|
10
|
-
export class ColumnTypeIconsComponent<T> extends ColumnTypeComponent<T> {
|
|
11
|
-
@Input({required: true}) override column: ColumnaIcons<T> = {} as ColumnaIcons<T>;
|
|
12
|
-
|
|
13
|
-
obtenerItems(columna: any, row: any): IconsIcon[] {
|
|
14
|
-
if (typeof columna.items === 'function') {
|
|
15
|
-
return columna.items(row);
|
|
16
|
-
}
|
|
17
|
-
return columna.items;
|
|
18
|
-
}
|
|
19
|
-
}
|