@jvsoft/components 0.0.13-alpha.4 → 1.0.0-alpha.10
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/README.md +169 -0
- package/dialog-flotante/dialog-flotante.component.d.ts +13 -22
- 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 +928 -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 +1 -0
- package/lista-arbol/README.md +268 -0
- package/lista-arbol/lista-arbol.component.d.ts +36 -37
- package/package.json +14 -11
- 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,156 @@
|
|
|
1
|
+
# Documentación de FiltroBusquedaComponent
|
|
2
|
+
|
|
3
|
+
El componente `@jvsoft/components/filtro-busqueda` es un sistema dinámico de filtrado diseñado para Angular v19+. Utiliza **Signals** para la gestión de estado y ofrece una estética "orgánica" basada en elementos nativos con el poder de Angular Material.
|
|
4
|
+
|
|
5
|
+
## Características Principales
|
|
6
|
+
|
|
7
|
+
- **Angular 19+**: Aprovecha `signal()`, `input()`, `output()` y el nuevo flujo de control (`@if`, `@for`).
|
|
8
|
+
- **Estética Orgánica**: Labels sobre el borde (fieldset/legend) con tipografía limpia y bordes continuos.
|
|
9
|
+
- **Carga en Cascada (Niveles)**: Soporta hasta 5 niveles de peticiones asíncronas encadenadas mediante `ordenPeticion`.
|
|
10
|
+
- **Tipos de Control**: Autocomplete, Select, Date, Date Range, Checkbox, Text, Number, y Controles Agrupados.
|
|
11
|
+
- **Resumen Automático**: Genera una cadena legible (`labelResumen`) de todos los filtros aplicados.
|
|
12
|
+
- **Servicio Centralizado**: Gestión de estado reactiva mediante `FiltroBusquedaService`.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🚀 Instalación e Importación
|
|
17
|
+
|
|
18
|
+
Importa el componente en tu módulo o componente standalone:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { FiltroBusquedaComponent } from '@jvsoft/components/filtro-busqueda';
|
|
22
|
+
|
|
23
|
+
@Component({
|
|
24
|
+
standalone: true,
|
|
25
|
+
imports: [FiltroBusquedaComponent],
|
|
26
|
+
// ...
|
|
27
|
+
})
|
|
28
|
+
export class MiComponente {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🛠️ Configuración (CampoFiltro)
|
|
34
|
+
|
|
35
|
+
El componente se configura mediante un array de `TabSeccion`. Cada sección contiene un array de `CampoFiltro`.
|
|
36
|
+
|
|
37
|
+
### Propiedades de CampoFiltro
|
|
38
|
+
|
|
39
|
+
| Propiedad | Tipo | Descripción |
|
|
40
|
+
| :--- | :--- | :--- |
|
|
41
|
+
| `control` | `TiposControl` | `select`, `autocomplete`, `date`, `date_range`, `checkbox`, `text`, `number` |
|
|
42
|
+
| `campo` | `string` | Nombre del campo en el formulario y objeto resultante. |
|
|
43
|
+
| `label` | `string` | Texto descriptivo (se muestra en el legend). |
|
|
44
|
+
| `value` | `any` | Valor inicial (`*fechaActual*`, `*primero*`, etc). |
|
|
45
|
+
| `required` | `boolean` | Indica si el campo es obligatorio. |
|
|
46
|
+
| `select` / `autocomplete` | `Config` | Objeto de configuración específico para estos tipos. |
|
|
47
|
+
| `dateRange` | `Config` | Configuración para rangos de fechas. |
|
|
48
|
+
| `ordenPeticion` | `number (0-4)` | Nivel de carga cuando hay selects dependientes. |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 📊 Carga de Datos en Cascada
|
|
53
|
+
|
|
54
|
+
El componente utiliza un sistema de niveles para cargar datos del servidor de forma ordenada.
|
|
55
|
+
|
|
56
|
+
### Ejemplo: País -> Departamento -> Provincia
|
|
57
|
+
|
|
58
|
+
1. **Nivel 0**: Se carga la lista de Países.
|
|
59
|
+
2. **Nivel 1**: El select de Departamento tiene `ordenPeticion: 1` y espera a que el País tenga valor.
|
|
60
|
+
3. **Nivel 2**: El select de Provincia tiene `ordenPeticion: 2` y espera a Departamento.
|
|
61
|
+
|
|
62
|
+
Configura `reqParams.fields` para indicar qué campos debe enviar el control dependiente al servidor.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 🔄 Inputs y Outputs
|
|
67
|
+
|
|
68
|
+
### Inputs
|
|
69
|
+
- `opciones`: Array de `TabSeccion[]` con la configuración.
|
|
70
|
+
- `nombreColeccion`: ID único para el service (ej: `'tramitesBusqueda'`).
|
|
71
|
+
- `defaultTab`: Índice de la pestaña inicial (default `0`).
|
|
72
|
+
- `busquedaAutomatica`: Si es `true`, emite cambios en cada interacción.
|
|
73
|
+
|
|
74
|
+
### Outputs
|
|
75
|
+
- `buscar`: **NUEVA API (Mejora 2)**. Evento principal de filtrado. Emite la interfaz `FiltroResultante` con los datos listos para API y las etiquetas legibles (`labelResumen`).
|
|
76
|
+
- `resultados`: **@deprecated**. Solo emite el diccionario crudo. Se mantiene temporalmente por retrocompatibilidad. ¡Usa `(buscar)` en su lugar!
|
|
77
|
+
- `dataFiltro`: **@deprecated** (Paradigma Zero-Output). En lugar de escuchar este evento, inyecta el `FiltroBusquedaService` y usa `getFiltroSignal()`.
|
|
78
|
+
- `cargaCompleta`: **@deprecated** (Paradigma Zero-Output). Depender de Signals en el servicio evita la necesidad de este output de sincronización.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## � Acceso al Estado (Angular 19+ Signals)
|
|
83
|
+
|
|
84
|
+
El estado del filtro está centralizado en `FiltroBusquedaService`. Para acceder de forma reactiva y Zero-Cost desde cualquier componente, utiliza la nueva API basada en Signals:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { Component, inject, computed } from '@angular/core';
|
|
88
|
+
import { FiltroBusquedaService } from '@jvsoft/components/filtro-busqueda';
|
|
89
|
+
|
|
90
|
+
@Component({ ... })
|
|
91
|
+
export class MiVistaTabla {
|
|
92
|
+
private filtroService = inject(FiltroBusquedaService);
|
|
93
|
+
|
|
94
|
+
// 1. Obtener los valores del formulario continuamente
|
|
95
|
+
// Retorna un Signal<any>, inicializado con el fallback proveído.
|
|
96
|
+
readonly dataFiltro = this.filtroService.getFiltroSignal('tramitesBusqueda', { datosFiltro: {} });
|
|
97
|
+
|
|
98
|
+
// 2. Obtener metadatos/catálogos que llegaron del servidor para un campo
|
|
99
|
+
readonly listaDepartamentos = this.filtroService.getDataServidorSignal('tramitesBusqueda', 'departamento_id', []);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
> **Nota**: Los métodos `getValue()` y `getDataServidorSuscripcion()` aún existen para retrocompatibilidad síncrona, pero su uso reactivo con RxJS está marcado como **@deprecated**.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## �📋 FiltroResultante
|
|
108
|
+
|
|
109
|
+
El objeto emitido por `resultados` tiene esta estructura:
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
export interface FiltroResultante {
|
|
113
|
+
datosFiltro: { [key: string]: any }; // Datos crudos para enviar al API
|
|
114
|
+
datosFiltroConLabel: DataFiltroAplicado[]; // Metadatos con etiquetas
|
|
115
|
+
labelResumen: string; // "Periodo: 01/01/2026 - 31/01/2026 | Estado: Activo"
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 💉 Token de Servicio de Datos (QUERY_SERVICE_TOKEN)
|
|
122
|
+
|
|
123
|
+
El componente no sabe cómo llamar a tu API. Debes proveer una implementación del `QUERY_SERVICE_TOKEN`:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
{
|
|
127
|
+
provide: QUERY_SERVICE_TOKEN,
|
|
128
|
+
useExisting: MiApiService // Debe tener un método .cargar(...)
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🧪 Ejemplo de Autocomplete
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
{
|
|
138
|
+
control: 'autocomplete',
|
|
139
|
+
campo: 'idEntidad',
|
|
140
|
+
label: 'Entidad',
|
|
141
|
+
autocomplete: {
|
|
142
|
+
data: 'entidades', // Nombre de la consulta al servidor
|
|
143
|
+
camposText: ['nombre', 'ruc'], // Campos para el label
|
|
144
|
+
campotxtBuscar: 'nombre', // Parámetro de búsqueda al API
|
|
145
|
+
campotxtBuscarLength: 3 // Mínimo caracteres para disparar búsqueda
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 💡 Mejores Prácticas
|
|
153
|
+
|
|
154
|
+
- Usa `nombreColeccion` descriptivos para evitar colisiones en el `FiltroBusquedaService`.
|
|
155
|
+
- Aprovecha `labelResumen` para mostrar al usuario qué filtros tiene activos sin ocupar mucho espacio.
|
|
156
|
+
- En `date_range`, usa `value: ['*fechaActual*', '*fechaActual*']` para inicializar el día de hoy cómodamente.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { InjectionToken, OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Observable, Subject } from 'rxjs';
|
|
3
|
+
import { FormArray, FormControl, FormGroup } from '@angular/forms';
|
|
4
|
+
import { DataServidor, mostrarValorEnBusqueda, tipoValorFuncion } from '@jvsoft/utils';
|
|
5
|
+
import { CampoFiltro, FiltroResultante, TabFiltroSeccion, TabSeccion } from './interfaces/filtro-busqueda.interface';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export interface IQueryService {
|
|
8
|
+
cargar(objThis: any, reqArray: string[], data: any, anonimo: boolean, prefix: string): Promise<any>;
|
|
9
|
+
}
|
|
10
|
+
export declare const QUERY_SERVICE_TOKEN: InjectionToken<IQueryService>;
|
|
11
|
+
export declare class FiltroBusquedaComponent implements OnInit, OnDestroy {
|
|
12
|
+
private fb;
|
|
13
|
+
private toastr;
|
|
14
|
+
private filtroBusquedaService;
|
|
15
|
+
private queryService;
|
|
16
|
+
opciones: import("@angular/core").InputSignal<TabSeccion[]>;
|
|
17
|
+
nombreColeccionInput: import("@angular/core").InputSignal<string>;
|
|
18
|
+
prefijoConsulta: import("@angular/core").InputSignal<string>;
|
|
19
|
+
busquedaAutomatica: import("@angular/core").InputSignal<boolean>;
|
|
20
|
+
opciones$: import("@angular/core").InputSignal<Observable<TabSeccion[]> | undefined>;
|
|
21
|
+
modificarOpciones$: import("@angular/core").InputSignal<Observable<{
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}> | undefined>;
|
|
24
|
+
defaultTab: import("@angular/core").InputSignal<number>;
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated Paradigma Zero-Output: Inyecta FiltroBusquedaService y usa `getFiltroSignal('nombreColeccion')` para estado en tiempo real, esto evita renderizados innecesarios del padre.
|
|
27
|
+
*/
|
|
28
|
+
dataFiltro: import("@angular/core").OutputEmitterRef<any>;
|
|
29
|
+
/**
|
|
30
|
+
* @deprecated Su payload de diccionario crudo desaparecerá pronto (Mejora 2). Migra al nuevo evento `(buscar)` que emite la interfaz `FiltroResultante`.
|
|
31
|
+
* Se mantiene temporalmente para componentes legacy.
|
|
32
|
+
*/
|
|
33
|
+
resultados: import("@angular/core").OutputEmitterRef<any>;
|
|
34
|
+
/**
|
|
35
|
+
* Evento principal explícito de búsqueda (Click en Filtrar). Emite el objeto con metadata y labels.
|
|
36
|
+
*/
|
|
37
|
+
buscar: import("@angular/core").OutputEmitterRef<FiltroResultante>;
|
|
38
|
+
/**
|
|
39
|
+
* @deprecated Paradigma Zero-Output: Maneja la finalización de carga a través de los Signals internos del servicio o asume inmediatez de la arquitectura nueva.
|
|
40
|
+
*/
|
|
41
|
+
cargaCompleta: import("@angular/core").OutputEmitterRef<boolean>;
|
|
42
|
+
tabActual: import("@angular/core").WritableSignal<number>;
|
|
43
|
+
dataOpcionesNuevo: import("@angular/core").WritableSignal<TabFiltroSeccion[]>;
|
|
44
|
+
isCargaCompleta: import("@angular/core").WritableSignal<boolean>;
|
|
45
|
+
frmFiltroBusqueda: FormGroup;
|
|
46
|
+
get opcionesTabs(): FormArray;
|
|
47
|
+
get frmGroupSeleccionado(): FormGroup;
|
|
48
|
+
getControl(nombre: string): FormControl;
|
|
49
|
+
getControlRaiz(nombre: string): FormControl;
|
|
50
|
+
getAutocompleteLabel(controlData: CampoFiltro, value: any): string;
|
|
51
|
+
dataServidor: DataServidor;
|
|
52
|
+
dataServidorSuscripcion: {
|
|
53
|
+
[key: string]: BehaviorSubject<any>;
|
|
54
|
+
};
|
|
55
|
+
filtrados: {
|
|
56
|
+
[key: string]: any[];
|
|
57
|
+
};
|
|
58
|
+
inputParaEnviarAutocomplete: Subject<any>;
|
|
59
|
+
private destroy$;
|
|
60
|
+
protected sufixTemporal: string;
|
|
61
|
+
protected tipoValorFuncion: typeof tipoValorFuncion;
|
|
62
|
+
private fechaActual;
|
|
63
|
+
constructor();
|
|
64
|
+
ngOnInit(): void;
|
|
65
|
+
private initOpciones;
|
|
66
|
+
private reorganizarOpcionesNuevas;
|
|
67
|
+
cargarDatosFiltroNuevo(idTab?: number): Promise<void>;
|
|
68
|
+
private actualizarEstadoService;
|
|
69
|
+
private setCustomData;
|
|
70
|
+
private procesarRetornoDatos;
|
|
71
|
+
getFiltroResultante(): FiltroResultante;
|
|
72
|
+
mostrarValorEnBusqueda: typeof mostrarValorEnBusqueda;
|
|
73
|
+
campoValorEval(campoFiltro: CampoFiltro, itemSelect: any): any;
|
|
74
|
+
campoTextEval(campoFiltro: CampoFiltro, itemSelect: any): string;
|
|
75
|
+
concatenarCadenasArray(array: string | string[], objData: any): any;
|
|
76
|
+
filtrarData(): void;
|
|
77
|
+
actualizarEnFormArray(name: string, value: any, extra?: {
|
|
78
|
+
disabled?: boolean;
|
|
79
|
+
}): void;
|
|
80
|
+
accionPosteriorCambioAutocomplete(controlData: CampoFiltro, valControl: any): void;
|
|
81
|
+
cambiarNuevo(campo: CampoFiltro, val: any): void;
|
|
82
|
+
cambiarSeleccionNuevo(campo: CampoFiltro, event?: any): void;
|
|
83
|
+
buscarControl(campo: string): CampoFiltro | undefined;
|
|
84
|
+
generarParams(meta: CampoFiltro, trigger: CampoFiltro): any;
|
|
85
|
+
limpiarAutocomplete(campo: CampoFiltro, event: Event): void;
|
|
86
|
+
ngOnDestroy(): void;
|
|
87
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FiltroBusquedaComponent, never>;
|
|
88
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FiltroBusquedaComponent, "jvs-filtro-busqueda", never, { "opciones": { "alias": "opciones"; "required": false; "isSignal": true; }; "nombreColeccionInput": { "alias": "nombreColeccion"; "required": false; "isSignal": true; }; "prefijoConsulta": { "alias": "prefijoConsulta"; "required": false; "isSignal": true; }; "busquedaAutomatica": { "alias": "busquedaAutomatica"; "required": false; "isSignal": true; }; "opciones$": { "alias": "opciones$"; "required": false; "isSignal": true; }; "modificarOpciones$": { "alias": "modificarOpciones$"; "required": false; "isSignal": true; }; "defaultTab": { "alias": "defaultTab"; "required": false; "isSignal": true; }; }, { "dataFiltro": "dataFiltro"; "resultados": "resultados"; "buscar": "buscar"; "cargaCompleta": "cargaCompleta"; }, never, never, true, never>;
|
|
89
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
@use '@angular/material' as mat;
|
|
2
|
+
|
|
3
|
+
.jvsFiltroBusqueda {
|
|
4
|
+
@include mat.all-component-densities(-3);
|
|
5
|
+
@apply py-1;
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
.mat-mdc-tab,
|
|
9
|
+
.mat-mdc-tab-label,
|
|
10
|
+
.mat-tab-label {
|
|
11
|
+
height: 24px !important;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
[aria-label=primary] {
|
|
15
|
+
color: rgb(var(--color-primary-contrast));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.mat-mdc-tab {
|
|
19
|
+
border-bottom: solid 2px !important;
|
|
20
|
+
border-bottom-color: rgb(var(--color-primary)) !important;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.mat-mdc-tab.mdc-tab--active {
|
|
24
|
+
@apply bg-primary/20;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label {
|
|
28
|
+
color: rgb(var(--color-primary-selected-tab)) !important;
|
|
29
|
+
font-weight: bold;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fieldset.contenedorCampo {
|
|
33
|
+
@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border-0;
|
|
34
|
+
|
|
35
|
+
legend {
|
|
36
|
+
@apply px-2 text-2xs font-light border-0 bg-transparent;
|
|
37
|
+
width: auto;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.formcontrol-container,
|
|
41
|
+
.daterange-container,
|
|
42
|
+
.date-container,
|
|
43
|
+
.campos-container,
|
|
44
|
+
select, input, textarea {
|
|
45
|
+
@apply w-full bg-white border border-gray-300 rounded-sm leading-tight focus:outline-none focus:border-blue-500 /*dark:*/
|
|
46
|
+
bg-transparent;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
input {
|
|
50
|
+
padding-left: 2px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.formcontrol-container {
|
|
54
|
+
textarea, input {
|
|
55
|
+
@apply text-xs border-0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.daterange-container {
|
|
60
|
+
width: 200px;
|
|
61
|
+
|
|
62
|
+
input {
|
|
63
|
+
@apply text-xs text-center border-0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.date-container {
|
|
68
|
+
width: 100px;
|
|
69
|
+
|
|
70
|
+
input {
|
|
71
|
+
@apply text-xs border-0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
.campos-container {
|
|
75
|
+
select, input, textarea {
|
|
76
|
+
@apply text-xs border-0 rounded-none;
|
|
77
|
+
}
|
|
78
|
+
input, textarea {
|
|
79
|
+
@apply border-l px-1;
|
|
80
|
+
}
|
|
81
|
+
.formcontrol-container {
|
|
82
|
+
@apply border-none;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.mat-datepicker-toggle {
|
|
87
|
+
//@apply w-auto h-auto;
|
|
88
|
+
height: 18px !important;
|
|
89
|
+
width: 18px !important;
|
|
90
|
+
|
|
91
|
+
button {
|
|
92
|
+
height: unset !important;
|
|
93
|
+
width: unset !important;
|
|
94
|
+
padding: 0 !important;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class FiltroBusquedaService {
|
|
3
|
+
private _filtrosActivos;
|
|
4
|
+
private _dataServidorActivos;
|
|
5
|
+
filtrosActivos: import("@angular/core").Signal<Map<string, any>>;
|
|
6
|
+
dataServidorActivos: import("@angular/core").Signal<Map<string, Map<string, any>>>;
|
|
7
|
+
/**
|
|
8
|
+
* Establece un valor para un filtro reactivo
|
|
9
|
+
*/
|
|
10
|
+
setValue(nombreFiltro: string, val: any): void;
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated Usa `getFiltroSignal(nombreFiltro)` en componentes modernos.
|
|
13
|
+
* Retorna el snapshot sincrónico actual (para componentes legacy).
|
|
14
|
+
*/
|
|
15
|
+
getValue(nombreFiltro: string): any;
|
|
16
|
+
/**
|
|
17
|
+
* Actualiza la metadata del servidor (Signals).
|
|
18
|
+
*/
|
|
19
|
+
setDataServidorSuscripcion(nombreFiltro: string, campo: string, data: any): void;
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated Usa `getDataServidorSignal(nombreFiltro, campo)` en componentes modernos.
|
|
22
|
+
* Retorna el snapshot sincrónico actual de metadata (para componentes legacy).
|
|
23
|
+
*/
|
|
24
|
+
getDataServidorSuscripcion(nombreFiltro: string, campo: string): any;
|
|
25
|
+
/**
|
|
26
|
+
* Crea y devuelve un Signal reactivo continuo para observar los valores aplicados de un filtro particular.
|
|
27
|
+
* @param nombreFiltro Nombre del filtro que se desea escuchar
|
|
28
|
+
* @param defaultValue Valor de respaldo seguro si aún no se ha inicializado el filtro.
|
|
29
|
+
*/
|
|
30
|
+
getFiltroSignal<T = any>(nombreFiltro: string, defaultValue?: T): import("@angular/core").Signal<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Crea y devuelve un Signal reactivo continuo para escuchar la metadata/catálogo recibida del backend para un campo.
|
|
33
|
+
* @param nombreFiltro Nombre de la colección del filtro principal
|
|
34
|
+
* @param campo Campo específico (ej: id_usuario, categoria) del que se espera escuchar la lista u objeto servidor
|
|
35
|
+
* @param defaultValue Valor de respaldo seguro si aún no hay data del servidor.
|
|
36
|
+
*/
|
|
37
|
+
getDataServidorSignal<T = any>(nombreFiltro: string, campo: string, defaultValue?: T): import("@angular/core").Signal<T>;
|
|
38
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FiltroBusquedaService, never>;
|
|
39
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<FiltroBusquedaService>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import { TipoValorFuncion } from '@jvsoft/utils';
|
|
3
|
+
export type TiposControl = 'select' | 'autocomplete' | 'date' | 'text' | 'number' | 'date_range' | 'controlAgrupado' | 'checkbox';
|
|
4
|
+
export type TiposValores = '*primero*' | '*deUsuario*' | '*fechaActual*' | any;
|
|
5
|
+
export interface TabSeccion {
|
|
6
|
+
id?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
campos?: CampoFiltro[];
|
|
9
|
+
esVisible?: TipoValorFuncion<boolean>;
|
|
10
|
+
}
|
|
11
|
+
export interface CampoFiltroChange {
|
|
12
|
+
filter?: boolean;
|
|
13
|
+
filterFields?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface CampoFiltroSelectAutocompleteComun {
|
|
16
|
+
ordenPeticion?: number;
|
|
17
|
+
data?: string;
|
|
18
|
+
customData?: any[];
|
|
19
|
+
dataCuandoVacio?: any[];
|
|
20
|
+
campoValor?: string | '*objeto*';
|
|
21
|
+
camposText?: string[];
|
|
22
|
+
textoCuandoNulo?: string;
|
|
23
|
+
optionText?(row: any): string;
|
|
24
|
+
cssClass?: {
|
|
25
|
+
class?: string;
|
|
26
|
+
option?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface CampoFiltroDateRange {
|
|
30
|
+
campo?: [string, string];
|
|
31
|
+
value?: [TiposValores, TiposValores];
|
|
32
|
+
}
|
|
33
|
+
export interface CampoFiltroSelect extends CampoFiltroSelectAutocompleteComun {
|
|
34
|
+
}
|
|
35
|
+
export interface CampoFiltroAutocomplete extends CampoFiltroSelectAutocompleteComun {
|
|
36
|
+
controlType?: 'textarea' | 'text';
|
|
37
|
+
class?: string;
|
|
38
|
+
searchFields?: string[];
|
|
39
|
+
campotxtBuscar?: string;
|
|
40
|
+
campotxtBuscarLength?: number;
|
|
41
|
+
optionTemplate?: TemplateRef<any>;
|
|
42
|
+
optionInnerHtml?(row: any): string;
|
|
43
|
+
}
|
|
44
|
+
export interface CampoFiltro {
|
|
45
|
+
control: TiposControl;
|
|
46
|
+
templateName?: string;
|
|
47
|
+
campo: string;
|
|
48
|
+
aliasCampoEnviar?: string;
|
|
49
|
+
label?: string;
|
|
50
|
+
cssClass?: string;
|
|
51
|
+
value?: TiposValores;
|
|
52
|
+
reqParams?: {
|
|
53
|
+
params?: object;
|
|
54
|
+
fields?: string[];
|
|
55
|
+
};
|
|
56
|
+
disabled?: boolean;
|
|
57
|
+
required?: boolean;
|
|
58
|
+
keyUpEnter?: boolean;
|
|
59
|
+
change?: CampoFiltroChange;
|
|
60
|
+
checkbox?: {
|
|
61
|
+
text: TipoValorFuncion<string>;
|
|
62
|
+
};
|
|
63
|
+
dateRange?: CampoFiltroDateRange;
|
|
64
|
+
select?: CampoFiltroSelect;
|
|
65
|
+
autocomplete?: CampoFiltroAutocomplete;
|
|
66
|
+
controlAgrupado?: CampoFiltro[];
|
|
67
|
+
modificadorDatos?(control: CampoFiltro): any;
|
|
68
|
+
}
|
|
69
|
+
export interface TabFiltroSeccion extends Omit<TabSeccion, 'id'> {
|
|
70
|
+
campos: CampoFiltro[];
|
|
71
|
+
}
|
|
72
|
+
export interface DataFiltroAplicado {
|
|
73
|
+
campo: string;
|
|
74
|
+
label: string;
|
|
75
|
+
value: any;
|
|
76
|
+
list?: any[];
|
|
77
|
+
valueString?: string;
|
|
78
|
+
valueObject?: any;
|
|
79
|
+
}
|
|
80
|
+
export interface FiltroResultante {
|
|
81
|
+
datosFiltro: {
|
|
82
|
+
[key: string]: any;
|
|
83
|
+
};
|
|
84
|
+
datosFiltroConLabel: DataFiltroAplicado[];
|
|
85
|
+
labelResumen: string;
|
|
86
|
+
}
|
package/index.d.ts
CHANGED