@jvsoft/components 0.0.13-alpha.4 → 1.0.0-alpha.11
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/alerta/README.md +102 -0
- package/alerta/alerta.component.d.ts +29 -0
- package/alerta/index.d.ts +5 -0
- package/alerta/public-api.d.ts +1 -0
- package/dialog-flotante/README.md +169 -0
- package/dialog-flotante/dialog-flotante.component.d.ts +13 -22
- package/fesm2022/jvsoft-components-alerta.mjs +88 -0
- package/fesm2022/jvsoft-components-alerta.mjs.map +1 -0
- package/fesm2022/jvsoft-components-dialog-flotante.mjs +49 -83
- package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +1 -1
- package/fesm2022/jvsoft-components-filtro-busqueda.mjs +660 -0
- package/fesm2022/jvsoft-components-filtro-busqueda.mjs.map +1 -0
- package/fesm2022/jvsoft-components-lista-arbol.mjs +121 -145
- package/fesm2022/jvsoft-components-lista-arbol.mjs.map +1 -1
- package/fesm2022/jvsoft-components-luces-navidad.mjs.map +1 -1
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +4 -2
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +1 -1
- package/fesm2022/jvsoft-components-menu.mjs.map +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +107 -61
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +1 -1
- package/fesm2022/jvsoft-components.mjs +1004 -302
- package/fesm2022/jvsoft-components.mjs.map +1 -1
- package/filtro-busqueda/README.md +156 -0
- package/filtro-busqueda/filtro-busqueda.component.d.ts +89 -0
- package/filtro-busqueda/filtro-busqueda.component.scss +98 -0
- package/filtro-busqueda/filtro-busqueda.service.d.ts +40 -0
- package/filtro-busqueda/index.d.ts +5 -0
- package/filtro-busqueda/interfaces/filtro-busqueda.interface.d.ts +86 -0
- package/filtro-busqueda/public-api.d.ts +3 -0
- package/index.d.ts +2 -0
- package/lista-arbol/README.md +268 -0
- package/lista-arbol/lista-arbol.component.d.ts +36 -37
- package/package.json +22 -15
- package/src/styles/base-jvsoft-components.css +6 -4
- package/src/styles/base.scss +1 -0
- package/tabla-mantenimiento/interfaces/global/columnas-tabla.d.ts +9 -10
- package/tabla-mantenimiento/interfaces/global/otros.d.ts +1 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts +2 -1
- package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +15 -8
- package/tabla-mantenimiento/tabla-mantenimiento.component.scss +14 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# ListaArbolComponent
|
|
2
|
+
|
|
3
|
+
Componente Angular para visualizar datos jerárquicos en estructura de árbol con soporte para selección, checkboxes y menú contextual.
|
|
4
|
+
|
|
5
|
+
## Instalación
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @jvsoft/components
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Uso Básico
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { ListaArbolComponent } from '@jvsoft/components/lista-arbol';
|
|
15
|
+
|
|
16
|
+
@Component({
|
|
17
|
+
selector: 'app-example',
|
|
18
|
+
standalone: true,
|
|
19
|
+
imports: [ListaArbolComponent],
|
|
20
|
+
template: `
|
|
21
|
+
<jvs-lista-arbol
|
|
22
|
+
[listaSuscription]="despachos$"
|
|
23
|
+
nombreColeccion="despachos"
|
|
24
|
+
[idTabla]="['iDespachoId']"
|
|
25
|
+
campoId="iDespachoId"
|
|
26
|
+
campoIdPadre="iDespachoPadreId"
|
|
27
|
+
campoStr="cDespachoNombre"
|
|
28
|
+
(seleccionado)="onSeleccion($event)">
|
|
29
|
+
</jvs-lista-arbol>
|
|
30
|
+
`
|
|
31
|
+
})
|
|
32
|
+
export class ExampleComponent {
|
|
33
|
+
despachos$ = this.service.getDespachos();
|
|
34
|
+
|
|
35
|
+
onSeleccion(item: any) {
|
|
36
|
+
console.log('Item seleccionado:', item);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
### Inputs
|
|
44
|
+
|
|
45
|
+
#### Requeridos
|
|
46
|
+
|
|
47
|
+
| Input | Tipo | Descripción |
|
|
48
|
+
|-------|------|-------------|
|
|
49
|
+
| `listaSuscription` | `Observable<T[]>` | Observable que emite la lista de datos a mostrar |
|
|
50
|
+
| `nombreColeccion` | `string` | Nombre identificador de la colección |
|
|
51
|
+
| `idTabla` | `string \| string[]` | Campo(s) que identifican únicamente cada item |
|
|
52
|
+
| `campoId` | `string` | Nombre del campo que contiene el ID del item |
|
|
53
|
+
| `campoIdPadre` | `string` | Nombre del campo que contiene el ID del padre |
|
|
54
|
+
|
|
55
|
+
#### Opcionales
|
|
56
|
+
|
|
57
|
+
| Input | Tipo | Default | Descripción |
|
|
58
|
+
|-------|------|---------|-------------|
|
|
59
|
+
| `campoStr` | `string` | `''` | Campo a mostrar como texto del nodo |
|
|
60
|
+
| `checkbox` | `boolean` | `false` | Habilita checkboxes con selección cascada |
|
|
61
|
+
| `expandirRecursivo` | `boolean` | `false` | Expande/colapsa recursivamente |
|
|
62
|
+
| `checkboxSeleccionados` | `T[]` | `[]` | Items pre-seleccionados (modo checkbox) |
|
|
63
|
+
| `campoOrden` | `string` | - | Campo para ordenar los nodos |
|
|
64
|
+
| `strHijoContainer` | `string` | `'hijos'` | Nombre de la propiedad que contiene los hijos |
|
|
65
|
+
| `menuContextual` | `object` | - | Objeto con funciones para menú contextual |
|
|
66
|
+
| `classSeleccionado` | `string[]` | `['bg-primary-activo', ...]` | Clases CSS para item seleccionado |
|
|
67
|
+
| `classAnulado` | `string[]` | `['line-through', ...]` | Clases CSS para items anulados |
|
|
68
|
+
| `campoAnulado` | `string \| null` | - | Campo que indica si un item está anulado |
|
|
69
|
+
| `templateTxtData` | `TemplateRef<any>` | - | Template personalizado para el contenido del nodo |
|
|
70
|
+
| `condicionMostrar` | `(item: T) => boolean` | - | Función para filtrar items a mostrar |
|
|
71
|
+
| `condicionesClaseFila` | `(item: T) => string[]` | `() => []` | Función que retorna clases CSS adicionales |
|
|
72
|
+
| `selectionModel` | `any` | - | Modelo de selección (backward compatibility) |
|
|
73
|
+
|
|
74
|
+
### Outputs
|
|
75
|
+
|
|
76
|
+
| Output | Tipo | Descripción |
|
|
77
|
+
|--------|------|-------------|
|
|
78
|
+
| `seleccionado` | `EventEmitter<any>` | Emite cuando se selecciona un item |
|
|
79
|
+
| `selectionModelChange` | `EventEmitter<any>` | Emite cambios en el modelo de selección |
|
|
80
|
+
| `listaCheck` | `EventEmitter<T[]>` | Emite array de items seleccionados (modo checkbox) |
|
|
81
|
+
| `listaCheckObj` | `EventEmitter<Record<string, any>>` | Emite objeto con items seleccionados (modo checkbox) |
|
|
82
|
+
|
|
83
|
+
## Ejemplos
|
|
84
|
+
|
|
85
|
+
### Árbol Simple
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
<jvs-lista-arbol
|
|
89
|
+
[listaSuscription]="categorias$"
|
|
90
|
+
nombreColeccion="categorias"
|
|
91
|
+
[idTabla]="['iCategoriaId']"
|
|
92
|
+
campoId="iCategoriaId"
|
|
93
|
+
campoIdPadre="iCategoriaPadreId"
|
|
94
|
+
campoStr="cCategoriaNombre">
|
|
95
|
+
</jvs-lista-arbol>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Con Checkboxes
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
<jvs-lista-arbol
|
|
102
|
+
[listaSuscription]="permisos$"
|
|
103
|
+
nombreColeccion="permisos"
|
|
104
|
+
[idTabla]="['iPermisoId']"
|
|
105
|
+
campoId="iPermisoId"
|
|
106
|
+
campoIdPadre="iPermisoPadreId"
|
|
107
|
+
campoStr="cPermisoNombre"
|
|
108
|
+
[checkbox]="true"
|
|
109
|
+
[checkboxSeleccionados]="permisosActuales"
|
|
110
|
+
(listaCheck)="onPermisosChange($event)">
|
|
111
|
+
</jvs-lista-arbol>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Con Template Personalizado
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
<jvs-lista-arbol
|
|
118
|
+
[listaSuscription]="departamentos$"
|
|
119
|
+
nombreColeccion="departamentos"
|
|
120
|
+
[idTabla]="['iDepartamentoId']"
|
|
121
|
+
campoId="iDepartamentoId"
|
|
122
|
+
campoIdPadre="iDepartamentoPadreId"
|
|
123
|
+
[templateTxtData]="customTemplate">
|
|
124
|
+
</jvs-lista-arbol>
|
|
125
|
+
|
|
126
|
+
<ng-template #customTemplate let-data="data">
|
|
127
|
+
<div class="flex items-center gap-2">
|
|
128
|
+
<mat-icon>{{ data.icono }}</mat-icon>
|
|
129
|
+
<span class="font-bold">{{ data.nombre }}</span>
|
|
130
|
+
<span class="text-gray-500">({{ data.codigo }})</span>
|
|
131
|
+
</div>
|
|
132
|
+
</ng-template>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Con Menú Contextual
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
export class MyComponent {
|
|
139
|
+
menuContextual = {
|
|
140
|
+
abrirMenuContextual: (event: MouseEvent, item: any) => {
|
|
141
|
+
// Lógica para abrir menú contextual
|
|
142
|
+
this.menuService.open(event, item);
|
|
143
|
+
},
|
|
144
|
+
cerrarMenuContextual: () => {
|
|
145
|
+
this.menuService.close();
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```html
|
|
152
|
+
<jvs-lista-arbol
|
|
153
|
+
[listaSuscription]="items$"
|
|
154
|
+
nombreColeccion="items"
|
|
155
|
+
[idTabla]="['id']"
|
|
156
|
+
campoId="id"
|
|
157
|
+
campoIdPadre="parentId"
|
|
158
|
+
campoStr="nombre"
|
|
159
|
+
[menuContextual]="menuContextual">
|
|
160
|
+
</jvs-lista-arbol>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Con Ordenamiento
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
<jvs-lista-arbol
|
|
167
|
+
[listaSuscription]="tareas$"
|
|
168
|
+
nombreColeccion="tareas"
|
|
169
|
+
[idTabla]="['iTareaId']"
|
|
170
|
+
campoId="iTareaId"
|
|
171
|
+
campoIdPadre="iTareaPadreId"
|
|
172
|
+
campoStr="cTareaNombre"
|
|
173
|
+
campoOrden="iOrden">
|
|
174
|
+
</jvs-lista-arbol>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Con Clases Condicionales
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
export class MyComponent {
|
|
181
|
+
getClasesFila = (item: any): string[] => {
|
|
182
|
+
const clases: string[] = [];
|
|
183
|
+
if (item.urgente) clases.push('bg-red-100');
|
|
184
|
+
if (item.completado) clases.push('opacity-50');
|
|
185
|
+
return clases;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```html
|
|
191
|
+
<jvs-lista-arbol
|
|
192
|
+
[listaSuscription]="tareas$"
|
|
193
|
+
nombreColeccion="tareas"
|
|
194
|
+
[idTabla]="['id']"
|
|
195
|
+
campoId="id"
|
|
196
|
+
campoIdPadre="parentId"
|
|
197
|
+
campoStr="nombre"
|
|
198
|
+
[condicionesClaseFila]="getClasesFila">
|
|
199
|
+
</jvs-lista-arbol>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Estructura de Datos
|
|
203
|
+
|
|
204
|
+
El componente espera un array plano de objetos con referencias padre-hijo:
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
interface Item {
|
|
208
|
+
id: number;
|
|
209
|
+
parentId: number | null;
|
|
210
|
+
nombre: string;
|
|
211
|
+
// ... otros campos
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const items: Item[] = [
|
|
215
|
+
{ id: 1, parentId: null, nombre: 'Raíz' },
|
|
216
|
+
{ id: 2, parentId: 1, nombre: 'Hijo 1' },
|
|
217
|
+
{ id: 3, parentId: 1, nombre: 'Hijo 2' },
|
|
218
|
+
{ id: 4, parentId: 2, nombre: 'Nieto 1' },
|
|
219
|
+
];
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
El componente automáticamente construye la estructura jerárquica.
|
|
223
|
+
|
|
224
|
+
## Características
|
|
225
|
+
|
|
226
|
+
- ✅ **Signals API**: Usa la API moderna de Signals de Angular
|
|
227
|
+
- ✅ **Selección simple**: Click para seleccionar items
|
|
228
|
+
- ✅ **Checkboxes con cascada**: Selección padre-hijo automática
|
|
229
|
+
- ✅ **Templates personalizados**: Personaliza la visualización de nodos
|
|
230
|
+
- ✅ **Menú contextual**: Soporte integrado para menús contextuales
|
|
231
|
+
- ✅ **Ordenamiento**: Ordena nodos por campo específico
|
|
232
|
+
- ✅ **Clases condicionales**: Aplica estilos dinámicos
|
|
233
|
+
- ✅ **Cleanup automático**: Gestión automática de suscripciones
|
|
234
|
+
- ✅ **TypeScript**: Totalmente tipado con genéricos
|
|
235
|
+
|
|
236
|
+
## Migración desde Versión Anterior
|
|
237
|
+
|
|
238
|
+
Si estás migrando desde una versión anterior con `@Input()` decorators:
|
|
239
|
+
|
|
240
|
+
### Antes (v1.0.0-alpha.5)
|
|
241
|
+
```typescript
|
|
242
|
+
@Input() listaSuscription!: Observable<T[]>;
|
|
243
|
+
@Input() nombreColeccion!: string;
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Después (v1.0.0-alpha.6+)
|
|
247
|
+
```typescript
|
|
248
|
+
// El uso en templates permanece igual
|
|
249
|
+
<jvs-lista-arbol
|
|
250
|
+
[listaSuscription]="items$"
|
|
251
|
+
nombreColeccion="items"
|
|
252
|
+
...>
|
|
253
|
+
</jvs-lista-arbol>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**No se requieren cambios** en el código que usa el componente. La API pública permanece 100% compatible.
|
|
257
|
+
|
|
258
|
+
## Notas Técnicas
|
|
259
|
+
|
|
260
|
+
- El componente usa `NestedTreeControl` de Angular CDK
|
|
261
|
+
- Las suscripciones se limpian automáticamente con `takeUntilDestroyed()`
|
|
262
|
+
- Los valores derivados usan `computed()` para optimización
|
|
263
|
+
- El estado interno usa `signal()` para reactividad
|
|
264
|
+
- Compatible con Angular 16+
|
|
265
|
+
|
|
266
|
+
## Licencia
|
|
267
|
+
|
|
268
|
+
MIT
|
|
@@ -1,47 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { NestedTreeControl } from '@angular/cdk/tree';
|
|
4
4
|
import { DataModel } from '@jvsoft/utils';
|
|
5
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
|
6
5
|
import * as i0 from "@angular/core";
|
|
7
|
-
export declare class ListaArbolComponent<T = any>
|
|
8
|
-
listaSuscription: Observable<T[]
|
|
9
|
-
nombreColeccion: string
|
|
10
|
-
checkbox: boolean
|
|
11
|
-
expandirRecursivo: boolean
|
|
12
|
-
checkboxSeleccionados: T[]
|
|
13
|
-
campoId: string
|
|
14
|
-
campoIdPadre: string
|
|
15
|
-
campoStr: string
|
|
16
|
-
campoOrden
|
|
17
|
-
strHijoContainer: string
|
|
18
|
-
menuContextual
|
|
6
|
+
export declare class ListaArbolComponent<T = any> {
|
|
7
|
+
listaSuscription: import("@angular/core").InputSignal<Observable<T[]>>;
|
|
8
|
+
nombreColeccion: import("@angular/core").InputSignal<string>;
|
|
9
|
+
checkbox: import("@angular/core").InputSignal<boolean>;
|
|
10
|
+
expandirRecursivo: import("@angular/core").InputSignal<boolean>;
|
|
11
|
+
checkboxSeleccionados: import("@angular/core").InputSignal<T[]>;
|
|
12
|
+
campoId: import("@angular/core").InputSignal<string>;
|
|
13
|
+
campoIdPadre: import("@angular/core").InputSignal<string>;
|
|
14
|
+
campoStr: import("@angular/core").InputSignal<string>;
|
|
15
|
+
campoOrden: import("@angular/core").InputSignal<string | undefined>;
|
|
16
|
+
strHijoContainer: import("@angular/core").InputSignal<string>;
|
|
17
|
+
menuContextual: import("@angular/core").InputSignal<{
|
|
19
18
|
abrirMenuContextual: Function;
|
|
20
19
|
cerrarMenuContextual: Function;
|
|
21
|
-
}
|
|
22
|
-
classSeleccionado: string[]
|
|
23
|
-
classAnulado: string[]
|
|
24
|
-
campoAnulado
|
|
25
|
-
templateTxtData
|
|
26
|
-
condicionMostrar
|
|
27
|
-
condicionesClaseFila: (item: T) => string[]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
} | undefined>;
|
|
21
|
+
classSeleccionado: import("@angular/core").InputSignal<string[]>;
|
|
22
|
+
classAnulado: import("@angular/core").InputSignal<string[]>;
|
|
23
|
+
campoAnulado: import("@angular/core").InputSignal<string | null | undefined>;
|
|
24
|
+
templateTxtData: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
25
|
+
condicionMostrar: import("@angular/core").InputSignal<((item: T) => boolean) | undefined>;
|
|
26
|
+
condicionesClaseFila: import("@angular/core").InputSignal<(item: T) => string[]>;
|
|
27
|
+
idTabla: import("@angular/core").InputSignalWithTransform<string | string[], string | string[]>;
|
|
28
|
+
selectionModel: import("@angular/core").InputSignal<any>;
|
|
29
|
+
selectionModelChange: import("@angular/core").OutputEmitterRef<any>;
|
|
30
|
+
seleccionado: import("@angular/core").OutputEmitterRef<any>;
|
|
31
|
+
listaCheck: import("@angular/core").OutputEmitterRef<T[]>;
|
|
32
|
+
listaCheckObj: import("@angular/core").OutputEmitterRef<Record<string, any>>;
|
|
33
33
|
private _idTabla;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
get objSeleccionado(): any;
|
|
38
|
-
set objSeleccionado(val: any);
|
|
34
|
+
private _seleccionado;
|
|
35
|
+
listaMuestraArbol: import("@angular/core").WritableSignal<T[]>;
|
|
36
|
+
listaOriginal: import("@angular/core").WritableSignal<T[]>;
|
|
39
37
|
chkLista: DataModel;
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
idTablaValue: import("@angular/core").Signal<string[]>;
|
|
39
|
+
buscarItemSeleccionado: import("@angular/core").Signal<NonNullable<T> | null>;
|
|
40
|
+
objSeleccionado: import("@angular/core").Signal<NonNullable<T> | null>;
|
|
42
41
|
treeControl: NestedTreeControl<any, any>;
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
private listaSuscription$;
|
|
43
|
+
constructor();
|
|
45
44
|
idTablaValor(data: any): string;
|
|
46
45
|
propiedadSeleccion(item: any): string;
|
|
47
46
|
esSeleccionActual(item: any): boolean;
|
|
@@ -52,7 +51,7 @@ export declare class ListaArbolComponent<T = any> implements OnInit {
|
|
|
52
51
|
cambiarPadre(checkActual: T, estado: boolean): void;
|
|
53
52
|
cambiarCheck(checkActual: T, estado: boolean): void;
|
|
54
53
|
hijosActivos(tipo: 'checked' | 'indeterminate', checkActual: T): boolean;
|
|
55
|
-
classFila(item: any):
|
|
54
|
+
classFila(item: any): string[];
|
|
56
55
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListaArbolComponent<any>, never>;
|
|
57
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ListaArbolComponent<any>, "jvs-lista-arbol", never, { "listaSuscription": { "alias": "listaSuscription"; "required":
|
|
56
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ListaArbolComponent<any>, "jvs-lista-arbol", never, { "listaSuscription": { "alias": "listaSuscription"; "required": true; "isSignal": true; }; "nombreColeccion": { "alias": "nombreColeccion"; "required": true; "isSignal": true; }; "checkbox": { "alias": "checkbox"; "required": false; "isSignal": true; }; "expandirRecursivo": { "alias": "expandirRecursivo"; "required": false; "isSignal": true; }; "checkboxSeleccionados": { "alias": "checkboxSeleccionados"; "required": false; "isSignal": true; }; "campoId": { "alias": "campoId"; "required": true; "isSignal": true; }; "campoIdPadre": { "alias": "campoIdPadre"; "required": true; "isSignal": true; }; "campoStr": { "alias": "campoStr"; "required": false; "isSignal": true; }; "campoOrden": { "alias": "campoOrden"; "required": false; "isSignal": true; }; "strHijoContainer": { "alias": "strHijoContainer"; "required": false; "isSignal": true; }; "menuContextual": { "alias": "menuContextual"; "required": false; "isSignal": true; }; "classSeleccionado": { "alias": "classSeleccionado"; "required": false; "isSignal": true; }; "classAnulado": { "alias": "classAnulado"; "required": false; "isSignal": true; }; "campoAnulado": { "alias": "campoAnulado"; "required": false; "isSignal": true; }; "templateTxtData": { "alias": "templateTxtData"; "required": false; "isSignal": true; }; "condicionMostrar": { "alias": "condicionMostrar"; "required": false; "isSignal": true; }; "condicionesClaseFila": { "alias": "condicionesClaseFila"; "required": false; "isSignal": true; }; "idTabla": { "alias": "idTabla"; "required": true; "isSignal": true; }; "selectionModel": { "alias": "selectionModel"; "required": false; "isSignal": true; }; }, { "selectionModelChange": "selectionModelChange"; "seleccionado": "seleccionado"; "listaCheck": "listaCheck"; "listaCheckObj": "listaCheckObj"; }, never, never, true, never>;
|
|
58
57
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jvsoft/components",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0-alpha.11",
|
|
4
4
|
"description": "JVSOFT Angular Components",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"tag": "alpha",
|
|
@@ -11,17 +11,13 @@
|
|
|
11
11
|
"@angular/core": ">=16.0.0",
|
|
12
12
|
"@angular/forms": ">=16.0.0",
|
|
13
13
|
"@angular/material": ">=16.0.0",
|
|
14
|
-
"@jvsoft/utils": "
|
|
14
|
+
"@jvsoft/utils": "workspace:*",
|
|
15
15
|
"@ngneat/until-destroy": "^10.0.0",
|
|
16
16
|
"moment": "^2.30.1",
|
|
17
17
|
"shorthash2": "^1.0.5",
|
|
18
18
|
"tailwindcss": "3",
|
|
19
19
|
"xlsx": "^0.18.5"
|
|
20
20
|
},
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"@jvsoft/utils": "*",
|
|
23
|
-
"tslib": "^2.3.0"
|
|
24
|
-
},
|
|
25
21
|
"sideEffects": false,
|
|
26
22
|
"exports": {
|
|
27
23
|
"./base.scss": "./src/styles/base.scss",
|
|
@@ -33,6 +29,18 @@
|
|
|
33
29
|
"types": "./index.d.ts",
|
|
34
30
|
"default": "./fesm2022/jvsoft-components.mjs"
|
|
35
31
|
},
|
|
32
|
+
"./alerta": {
|
|
33
|
+
"types": "./alerta/index.d.ts",
|
|
34
|
+
"default": "./fesm2022/jvsoft-components-alerta.mjs"
|
|
35
|
+
},
|
|
36
|
+
"./filtro-busqueda": {
|
|
37
|
+
"types": "./filtro-busqueda/index.d.ts",
|
|
38
|
+
"default": "./fesm2022/jvsoft-components-filtro-busqueda.mjs"
|
|
39
|
+
},
|
|
40
|
+
"./dialog-flotante": {
|
|
41
|
+
"types": "./dialog-flotante/index.d.ts",
|
|
42
|
+
"default": "./fesm2022/jvsoft-components-dialog-flotante.mjs"
|
|
43
|
+
},
|
|
36
44
|
"./luces-navidad": {
|
|
37
45
|
"types": "./luces-navidad/index.d.ts",
|
|
38
46
|
"default": "./fesm2022/jvsoft-components-luces-navidad.mjs"
|
|
@@ -45,23 +53,22 @@
|
|
|
45
53
|
"types": "./menu/index.d.ts",
|
|
46
54
|
"default": "./fesm2022/jvsoft-components-menu.mjs"
|
|
47
55
|
},
|
|
48
|
-
"./lista-arbol": {
|
|
49
|
-
"types": "./lista-arbol/index.d.ts",
|
|
50
|
-
"default": "./fesm2022/jvsoft-components-lista-arbol.mjs"
|
|
51
|
-
},
|
|
52
|
-
"./dialog-flotante": {
|
|
53
|
-
"types": "./dialog-flotante/index.d.ts",
|
|
54
|
-
"default": "./fesm2022/jvsoft-components-dialog-flotante.mjs"
|
|
55
|
-
},
|
|
56
56
|
"./tabla-mantenimiento": {
|
|
57
57
|
"types": "./tabla-mantenimiento/index.d.ts",
|
|
58
58
|
"default": "./fesm2022/jvsoft-components-tabla-mantenimiento.mjs"
|
|
59
59
|
},
|
|
60
|
+
"./lista-arbol": {
|
|
61
|
+
"types": "./lista-arbol/index.d.ts",
|
|
62
|
+
"default": "./fesm2022/jvsoft-components-lista-arbol.mjs"
|
|
63
|
+
},
|
|
60
64
|
"./tabla-mantenimiento/components/progress-bar": {
|
|
61
65
|
"types": "./tabla-mantenimiento/components/progress-bar/index.d.ts",
|
|
62
66
|
"default": "./fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs"
|
|
63
67
|
}
|
|
64
68
|
},
|
|
65
69
|
"module": "fesm2022/jvsoft-components.mjs",
|
|
66
|
-
"typings": "index.d.ts"
|
|
70
|
+
"typings": "index.d.ts",
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"tslib": "^2.3.0"
|
|
73
|
+
}
|
|
67
74
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
@use "tailwind.scss";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/*@use "components/index.scss";*/
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
@use "../../../components/tabla-mantenimiento/tabla-mantenimiento.component";
|
|
6
|
+
|
|
7
|
+
@use "../../../components/dialog-flotante/dialog-flotante.component";
|
|
8
|
+
|
|
9
|
+
@use "../../../components/filtro-busqueda/filtro-busqueda.component";
|
|
6
10
|
|
|
7
|
-
@import "../../components/tabla-mantenimiento/tabla-mantenimiento.component.scss";
|
|
8
|
-
*/
|
|
9
11
|
|
package/src/styles/base.scss
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { EstilosBarra } from '../../components/progress-bar';
|
|
2
2
|
import { TipoValorFuncion } from './no-export';
|
|
3
|
+
import { TemplateRef } from '@angular/core';
|
|
4
|
+
export interface PopoverConfig<T> {
|
|
5
|
+
content?: (row: T) => string;
|
|
6
|
+
template?: TemplateRef<any>;
|
|
7
|
+
trigger?: 'hover' | 'click' | 'focus';
|
|
8
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
9
|
+
customClass?: string;
|
|
10
|
+
}
|
|
3
11
|
type TiposColumnas = 'yes_no' | 'estiloEstablecido' | 'text' | 'number' | 'money' | 'date' | 'image' | 'estado' | 'badge' | 'progress' | 'checkbox' | 'icon' | 'icons' | 'icon_checkbox' | 'custom' | 'expandir' | 'numeracion_automatica';
|
|
4
12
|
export interface ColumnaTablaReporte {
|
|
5
13
|
ocultar?: boolean;
|
|
@@ -15,16 +23,6 @@ export interface ColumnaTablaReporte {
|
|
|
15
23
|
total?: TipoValorFuncion<any>;
|
|
16
24
|
};
|
|
17
25
|
}
|
|
18
|
-
export interface IconsIcon {
|
|
19
|
-
icon: string;
|
|
20
|
-
iconSize?: string;
|
|
21
|
-
toolTip?: string;
|
|
22
|
-
toolTipField?: string;
|
|
23
|
-
contentCss?: string;
|
|
24
|
-
cssClass?: string;
|
|
25
|
-
click?(row: any): void;
|
|
26
|
-
esVisible?(row: any): boolean;
|
|
27
|
-
}
|
|
28
26
|
export type TiposColumnasNuevo = 'text' | 'checkbox' | 'money' | 'icon' | 'icons' | 'progress' | 'expandir' | 'date' | 'number';
|
|
29
27
|
type PropiedadString<T> = Extract<keyof T, string>;
|
|
30
28
|
interface BaseColumna<T> {
|
|
@@ -44,6 +42,7 @@ interface BaseColumna<T> {
|
|
|
44
42
|
textCss?: string | string[];
|
|
45
43
|
cssFooterClasses?: string[];
|
|
46
44
|
datosExtra?: any;
|
|
45
|
+
popover?: PopoverConfig<T>;
|
|
47
46
|
reporte?: ColumnaTablaReporte;
|
|
48
47
|
innerHTMLInvisible?: (row: any) => string;
|
|
49
48
|
/** @deprecated usar `visible` en su lugar: ejm: visible: ():boolean => {}, visible: boolean */
|
|
@@ -9,6 +9,7 @@ export interface OpcionSeleccionada {
|
|
|
9
9
|
tipo: TiposOpciones;
|
|
10
10
|
/** Solo emite cuando se tiene los checkbox para seleccion */
|
|
11
11
|
idsSeleccionados?: any;
|
|
12
|
+
itemsSeleccionados?: any[];
|
|
12
13
|
datosExtra?: any;
|
|
13
14
|
/** @deprecated usar '`datosExtra`' en su lugar */
|
|
14
15
|
formGroup?: any;
|
package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts
CHANGED
|
@@ -16,8 +16,9 @@ import * as i14 from "../../pipes/zero-fill.pipe";
|
|
|
16
16
|
import * as i15 from "@angular/material/core";
|
|
17
17
|
import * as i16 from "@angular/material/icon";
|
|
18
18
|
import * as i17 from "../../components/progress-bar/progress-bar.component";
|
|
19
|
+
import * as i18 from "@jvsoft/utils";
|
|
19
20
|
export declare class ColumnTypeModule {
|
|
20
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<ColumnTypeModule, never>;
|
|
21
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<ColumnTypeModule, [typeof i1.ColumnTypeComponent, typeof i2.ColumnTypeTextComponent, typeof i3.ColumnTypeMoneyComponent, typeof i4.ColumnTypeNumberComponent, typeof i5.ColumnTypeDateComponent, typeof i6.ColumnTypeIconsComponent, typeof i7.ColumnTypeSinoComponent, typeof i8.ColumnTypeProgressbarComponent], [typeof i9.CommonModule, typeof i10.MatTableModule, typeof i11.MatSortModule, typeof i12.MatTooltipModule, typeof i13.NoSanitizePipe, typeof i14.ZeroFillPipe, typeof i15.MatRipple, typeof i16.MatIcon, typeof i17.ProgressBarComponent], [typeof i2.ColumnTypeTextComponent, typeof i3.ColumnTypeMoneyComponent, typeof i4.ColumnTypeNumberComponent, typeof i5.ColumnTypeDateComponent, typeof i6.ColumnTypeIconsComponent, typeof i7.ColumnTypeSinoComponent, typeof i8.ColumnTypeProgressbarComponent]>;
|
|
22
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ColumnTypeModule, [typeof i1.ColumnTypeComponent, typeof i2.ColumnTypeTextComponent, typeof i3.ColumnTypeMoneyComponent, typeof i4.ColumnTypeNumberComponent, typeof i5.ColumnTypeDateComponent, typeof i6.ColumnTypeIconsComponent, typeof i7.ColumnTypeSinoComponent, typeof i8.ColumnTypeProgressbarComponent], [typeof i9.CommonModule, typeof i10.MatTableModule, typeof i11.MatSortModule, typeof i12.MatTooltipModule, typeof i13.NoSanitizePipe, typeof i14.ZeroFillPipe, typeof i15.MatRipple, typeof i16.MatIcon, typeof i17.ProgressBarComponent, typeof i18.JvsPopoverDirective, typeof i18.JvsPopoverListenerDirective], [typeof i2.ColumnTypeTextComponent, typeof i3.ColumnTypeMoneyComponent, typeof i4.ColumnTypeNumberComponent, typeof i5.ColumnTypeDateComponent, typeof i6.ColumnTypeIconsComponent, typeof i7.ColumnTypeSinoComponent, typeof i8.ColumnTypeProgressbarComponent]>;
|
|
22
23
|
static ɵinj: i0.ɵɵInjectorDeclaration<ColumnTypeModule>;
|
|
23
24
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Overlay, OverlayRef } from '@angular/cdk/overlay';
|
|
2
2
|
import { AfterContentInit, ChangeDetectorRef, ElementRef, EventEmitter, OnChanges, OnInit, QueryList, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';
|
|
3
3
|
import { FormBuilder, FormControl } from '@angular/forms';
|
|
4
|
+
import { MatMenuTrigger } from '@angular/material/menu';
|
|
4
5
|
import { MatPaginator } from '@angular/material/paginator';
|
|
5
6
|
import { MatSort } from '@angular/material/sort';
|
|
6
7
|
import { MatColumnDef, MatTable, MatTableDataSource } from '@angular/material/table';
|
|
@@ -33,8 +34,8 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
33
34
|
dataSuscription: Observable<any> | undefined;
|
|
34
35
|
objThis: any;
|
|
35
36
|
nombreColeccion: any;
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
busquedaValor: import("@angular/core").InputSignal<string>;
|
|
38
|
+
busquedaPlaceholder: import("@angular/core").InputSignal<string>;
|
|
38
39
|
filtroCampos: boolean;
|
|
39
40
|
paginador: boolean;
|
|
40
41
|
esTabla: boolean;
|
|
@@ -58,11 +59,13 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
58
59
|
paginator: MatPaginator;
|
|
59
60
|
sort: MatSort;
|
|
60
61
|
exportarExcel: boolean;
|
|
62
|
+
busquedaCompacta: import("@angular/core").InputSignal<boolean>;
|
|
63
|
+
alturaFull: import("@angular/core").InputSignal<boolean>;
|
|
61
64
|
pageSize: number;
|
|
62
65
|
pageSizeOptions: number[];
|
|
63
66
|
dataSourceChange: EventEmitter<any>;
|
|
64
67
|
resultados: EventEmitter<any>;
|
|
65
|
-
dataSource: MatTableDataSource<
|
|
68
|
+
dataSource: MatTableDataSource<T, MatPaginator>;
|
|
66
69
|
table: MatTable<T>;
|
|
67
70
|
columnDefs: QueryList<MatColumnDef>;
|
|
68
71
|
componenteCargadoTotalmente: boolean;
|
|
@@ -80,15 +83,16 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
80
83
|
mouseEvent$: Subscription | undefined;
|
|
81
84
|
overlayRef: OverlayRef | undefined;
|
|
82
85
|
userMenu: TemplateRef<any>;
|
|
86
|
+
compactSearchMenuTrigger: MatMenuTrigger;
|
|
83
87
|
opcFiltroActual: {};
|
|
84
88
|
protected readonly capitalizarTexto: typeof capitalizarTexto;
|
|
85
89
|
_seleccionado: any;
|
|
86
90
|
cCampoBusqueda: FormControl<string | null>;
|
|
87
91
|
chkLista: DataModel;
|
|
92
|
+
bDireccionOrden: import("@angular/core").WritableSignal<number>;
|
|
93
|
+
mostrarBotonOrden: import("@angular/core").InputSignal<boolean>;
|
|
88
94
|
constructor(fb: FormBuilder, overlay: Overlay, viewContainerRef: ViewContainerRef, tablaMantenimientoService: TablaMantenimientoService, cdRef: ChangeDetectorRef);
|
|
89
|
-
|
|
90
|
-
get ctrlBusqueda(): TiposControlBusqueda;
|
|
91
|
-
set ctrlBusqueda(val: TiposControlBusqueda);
|
|
95
|
+
busquedaTipo: import("@angular/core").InputSignalWithTransform<TiposControlBusqueda, string>;
|
|
92
96
|
private _leyenda;
|
|
93
97
|
get leyenda(): {
|
|
94
98
|
text: string;
|
|
@@ -111,11 +115,12 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
111
115
|
get listaMenuCompleto(): BotonMantenimiento[];
|
|
112
116
|
get objVisibleColumns(): ColumnaTabla<any>[];
|
|
113
117
|
get visibleColumns(): string[];
|
|
114
|
-
get tieneCheckbox(): false | import("
|
|
118
|
+
get tieneCheckbox(): false | import("./interfaces").ColumnaCheckbox<any>;
|
|
115
119
|
get buscarItemSeleccionado(): any;
|
|
116
120
|
get objSeleccionado(): any;
|
|
117
121
|
set objSeleccionado(val: any);
|
|
118
122
|
get idsSeleccionado(): string;
|
|
123
|
+
get itemsSeleccionados(): T[];
|
|
119
124
|
idTablaValor(data: any): string;
|
|
120
125
|
condicionesClaseFila: (item: any) => any[];
|
|
121
126
|
rowTooltip: (item: any) => string;
|
|
@@ -134,6 +139,7 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
134
139
|
onFilterChange(value: string): void;
|
|
135
140
|
toggleColumnVisibility(column: any, event: any): void;
|
|
136
141
|
cargarData(retorno?: boolean): any;
|
|
142
|
+
toggleDireccionOrden(): void;
|
|
137
143
|
setData(data: any): void;
|
|
138
144
|
botonDisabled(btn: BotonMantenimiento, item: any): boolean | undefined;
|
|
139
145
|
propiedadSeleccion(item: any): string;
|
|
@@ -143,9 +149,10 @@ export declare class TablaMantenimientoComponent<T> implements OnInit, AfterCont
|
|
|
143
149
|
emitirResultados(evento?: {}): void;
|
|
144
150
|
abrirMenuContextual({ x, y }: MouseEvent, user: any): void;
|
|
145
151
|
cerrarMenuContextual(): void;
|
|
152
|
+
ejecutarBusquedaCompacta(): void;
|
|
146
153
|
emitirAccionRecargar(): void;
|
|
147
154
|
protected readonly tipoValorFuncion: typeof tipoValorFuncion;
|
|
148
155
|
static ɵfac: i0.ɵɵFactoryDeclaration<TablaMantenimientoComponent<any>, never>;
|
|
149
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TablaMantenimientoComponent<any>, "jvs-tabla-mantenimiento", never, { "dataSuscription": { "alias": "dataSuscription"; "required": false; }; "objThis": { "alias": "objThis"; "required": true; }; "nombreColeccion": { "alias": "nombreColeccion"; "required": true; }; "
|
|
156
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TablaMantenimientoComponent<any>, "jvs-tabla-mantenimiento", never, { "dataSuscription": { "alias": "dataSuscription"; "required": false; }; "objThis": { "alias": "objThis"; "required": true; }; "nombreColeccion": { "alias": "nombreColeccion"; "required": true; }; "busquedaValor": { "alias": "ctrlBusquedaValue"; "required": false; "isSignal": true; }; "busquedaPlaceholder": { "alias": "ctrlBusquedaPlaceholder"; "required": false; "isSignal": true; }; "filtroCampos": { "alias": "filtroCampos"; "required": false; }; "paginador": { "alias": "paginador"; "required": false; }; "esTabla": { "alias": "esTabla"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "filaExtraHeader": { "alias": "filaExtraHeader"; "required": false; }; "filaFooter": { "alias": "filaFooter"; "required": false; }; "botonesCRUD": { "alias": "botonesCRUD"; "required": false; }; "objBotonesCRUD": { "alias": "objBotonesCRUD"; "required": false; }; "classSeleccionado": { "alias": "classSeleccionado"; "required": false; }; "classAnulado": { "alias": "classAnulado"; "required": false; }; "campoAnulado": { "alias": "campoAnulado"; "required": false; }; "campoAnuladoMensaje": { "alias": "campoAnuladoMensaje"; "required": false; }; "selectionModel": { "alias": "selectionModel"; "required": false; }; "filaExtraTemplate": { "alias": "filaExtraTemplate"; "required": false; }; "exportarExcel": { "alias": "exportarExcel"; "required": false; }; "busquedaCompacta": { "alias": "busquedaCompacta"; "required": false; "isSignal": true; }; "alturaFull": { "alias": "alturaFull"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; "derechosActuales": { "alias": "derechosActuales"; "required": false; }; "mostrarBotonOrden": { "alias": "mostrarBotonOrden"; "required": false; "isSignal": true; }; "busquedaTipo": { "alias": "ctrlBusqueda"; "required": false; "isSignal": true; }; "leyenda": { "alias": "leyenda"; "required": false; }; "idTabla": { "alias": "idTabla"; "required": true; }; "columnasTabla": { "alias": "columnasTabla"; "required": false; }; "botonesMenu": { "alias": "botonesMenu"; "required": false; }; "condicionesClaseFila": { "alias": "condicionesClaseFila"; "required": false; }; "rowTooltip": { "alias": "rowTooltip"; "required": false; }; "soloIconos": { "alias": "soloIconos"; "required": false; }; }, { "dblclickItem": "dblclickItem"; "opcionSelecionada": "opcionSelecionada"; "opcBusqueda": "opcBusqueda"; "accionRecargar": "accionRecargar"; "selectionModelChange": "selectionModelChange"; "dataSourceChange": "dataSourceChange"; "resultados": "resultados"; }, ["columnDefs"], ["[filtro]", "[objetosMenuPegado]", "[objetosMenu]", "[botonesFiltro]", "[botonesConfig]", "[cuerpo]", "[tableDefinitions]", "[appendTable]"], true, never>;
|
|
150
157
|
}
|
|
151
158
|
export {};
|