@jvsoft/components 1.0.0-alpha.11 → 1.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { signal, computed, Injectable, InjectionToken, inject, input, output, Co
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import { Subject, BehaviorSubject } from 'rxjs';
6
- import moment from 'moment';
6
+ import { format } from 'date-fns';
7
7
  import * as i2 from '@angular/forms';
8
8
  import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
9
9
  import * as i3 from '@angular/material/autocomplete';
@@ -180,7 +180,7 @@ class FiltroBusquedaComponent {
180
180
  destroy$ = new Subject();
181
181
  sufixTemporal = '_temporal';
182
182
  tipoValorFuncion = tipoValorFuncion;
183
- fechaActual = moment().toDate();
183
+ fechaActual = new Date();
184
184
  constructor() {
185
185
  this.inputParaEnviarAutocomplete.pipe(debounceTime(500), takeUntil(this.destroy$)).subscribe((param) => {
186
186
  this.queryService?.cargar(this, [param.reqQuery], param.reqData, false, this.prefijoConsulta()).then((dRet) => {
@@ -374,17 +374,17 @@ class FiltroBusquedaComponent {
374
374
  const meta = { campo: campo.campo, label: campo.label || '', value: null };
375
375
  if (campo.dateRange) {
376
376
  const [fIni, fFin] = campo.dateRange.campo;
377
- datosFiltro[fIni] = rawForm[fIni] ? moment(rawForm[fIni]).format('YYYYMMDD') : '';
378
- datosFiltro[fFin] = rawForm[fFin] ? moment(rawForm[fFin]).format('YYYYMMDD') : '';
377
+ datosFiltro[fIni] = rawForm[fIni] ? format(rawForm[fIni], 'yyyyMMdd') : '';
378
+ datosFiltro[fFin] = rawForm[fFin] ? format(rawForm[fFin], 'yyyyMMdd') : '';
379
379
  if (rawForm[fIni] && rawForm[fFin]) {
380
- meta.value = `${moment(rawForm[fIni]).format('DD/MM/YYYY')} - ${moment(rawForm[fFin]).format('DD/MM/YYYY')}`;
380
+ meta.value = `${format(rawForm[fIni], 'dd/MM/yyyy')} - ${format(rawForm[fFin], 'dd/MM/yyyy')}`;
381
381
  resumenItems.push(`${meta.label}: ${meta.value}`);
382
382
  }
383
383
  }
384
384
  else if (campo.control === 'date') {
385
385
  const val = rawForm[campo.campo];
386
- datosFiltro[campo.campo] = val ? moment(val).format('YYYYMMDD') : '';
387
- meta.value = val ? moment(val).format('DD/MM/YYYY') : '';
386
+ datosFiltro[campo.campo] = val ? format(val, 'yyyyMMdd') : '';
387
+ meta.value = val ? format(val, 'dd/MM/yyyy') : '';
388
388
  if (meta.value)
389
389
  resumenItems.push(`${meta.label}: ${meta.value}`);
390
390
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jvsoft-components-filtro-busqueda.mjs","sources":["../../../projects/components/filtro-busqueda/filtro-busqueda.service.ts","../../../projects/components/filtro-busqueda/filtro-busqueda.component.ts","../../../projects/components/filtro-busqueda/filtro-busqueda.component.html","../../../projects/components/filtro-busqueda/jvsoft-components-filtro-busqueda.ts"],"sourcesContent":["import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FiltroBusquedaService {\n // Estado centralizado con Signals (Angular 19+)\n private _filtrosActivos = signal<Map<string, any>>(new Map());\n private _dataServidorActivos = signal<Map<string, Map<string, any>>>(new Map());\n\n // Interfaz de sólo lectura expuesta\n public filtrosActivos = this._filtrosActivos.asReadonly();\n public dataServidorActivos = this._dataServidorActivos.asReadonly();\n\n /**\n * Establece un valor para un filtro reactivo\n */\n setValue(nombreFiltro: string, val: any) {\n this._filtrosActivos.update(map => {\n const nextMap = new Map(map);\n nextMap.set(nombreFiltro, val);\n return nextMap;\n });\n }\n\n /**\n * @deprecated Usa `getFiltroSignal(nombreFiltro)` en componentes modernos.\n * Retorna el snapshot sincrónico actual (para componentes legacy).\n */\n getValue(nombreFiltro: string) {\n return this._filtrosActivos().get(nombreFiltro);\n }\n\n /**\n * Actualiza la metadata del servidor (Signals).\n */\n setDataServidorSuscripcion(nombreFiltro: string, campo: string, data: any) {\n this._dataServidorActivos.update(map => {\n const nextMap = new Map(map);\n let filterMap = nextMap.get(nombreFiltro) || new Map<string, any>();\n const nextFilterMap = new Map(filterMap);\n nextFilterMap.set(campo, data);\n nextMap.set(nombreFiltro, nextFilterMap);\n return nextMap;\n });\n }\n\n /**\n * @deprecated Usa `getDataServidorSignal(nombreFiltro, campo)` en componentes modernos.\n * Retorna el snapshot sincrónico actual de metadata (para componentes legacy).\n */\n getDataServidorSuscripcion(nombreFiltro: string, campo: string) {\n return this._dataServidorActivos().get(nombreFiltro)?.get(campo);\n }\n\n // --- Opciones Signal (Angular 19+) ---\n\n /**\n * Crea y devuelve un Signal reactivo continuo para observar los valores aplicados de un filtro particular.\n * @param nombreFiltro Nombre del filtro que se desea escuchar\n * @param defaultValue Valor de respaldo seguro si aún no se ha inicializado el filtro.\n */\n getFiltroSignal<T = any>(nombreFiltro: string, defaultValue?: T) {\n return computed(() => {\n const value = this._filtrosActivos().get(nombreFiltro);\n return (value ?? defaultValue) as T;\n });\n }\n\n /**\n * Crea y devuelve un Signal reactivo continuo para escuchar la metadata/catálogo recibida del backend para un campo.\n * @param nombreFiltro Nombre de la colección del filtro principal\n * @param campo Campo específico (ej: id_usuario, categoria) del que se espera escuchar la lista u objeto servidor\n * @param defaultValue Valor de respaldo seguro si aún no hay data del servidor.\n */\n getDataServidorSignal<T = any>(nombreFiltro: string, campo: string, defaultValue?: T) {\n return computed(() => {\n const value = this._dataServidorActivos().get(nombreFiltro)?.get(campo);\n return (value ?? defaultValue) as T;\n });\n }\n}\n","import {Component, inject, InjectionToken, input, OnDestroy, OnInit, output, signal} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport moment from 'moment';\nimport {FormArray, FormBuilder, FormControl, FormGroup, FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatDatepickerModule} from '@angular/material/datepicker';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatOptionModule, MatRippleModule} from '@angular/material/core';\nimport {MatRadioModule} from '@angular/material/radio';\nimport {MatSelectModule} from '@angular/material/select';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {TextFieldModule} from '@angular/cdk/text-field';\nimport {debounceTime, distinctUntilChanged, takeUntil} from 'rxjs/operators';\nimport {ToastrService} from 'ngx-toastr';\n\nimport {dataEnLista, DataServidor, establecerQuitarRequired, generateRandomString, getFormValidationErrors, getUniqueValues, mostrarValorEnBusqueda, tipoValorFuncion} from '@jvsoft/utils';\n\nimport {FiltroBusquedaService} from './filtro-busqueda.service';\nimport {CampoFiltro, DataFiltroAplicado, FiltroResultante, TabFiltroSeccion, TabSeccion} from './interfaces/filtro-busqueda.interface';\n\nexport interface IQueryService {\n cargar(objThis: any, reqArray: string[], data: any, anonimo: boolean, prefix: string ): Promise<any>;\n}\nexport const QUERY_SERVICE_TOKEN = new InjectionToken<IQueryService>('QUERY_SERVICE_TOKEN');\n\n@Component({\n selector: 'jvs-filtro-busqueda',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatOptionModule,\n MatRadioModule,\n MatRippleModule,\n MatSelectModule,\n MatTabsModule,\n TextFieldModule,\n ],\n templateUrl: './filtro-busqueda.component.html',\n host: {\n class: 'jvsFiltroBusqueda',\n },\n})\nexport class FiltroBusquedaComponent implements OnInit, OnDestroy {\n private fb = inject(FormBuilder);\n private toastr = inject(ToastrService);\n private filtroBusquedaService: FiltroBusquedaService = inject(FiltroBusquedaService);\n private queryService = inject(QUERY_SERVICE_TOKEN, { optional: true }) as IQueryService;\n\n opciones = input<TabSeccion[]>([]);\n nombreColeccionInput = input<string>(generateRandomString(10), { alias: 'nombreColeccion' });\n prefijoConsulta = input<string>('grl');\n busquedaAutomatica = input<boolean>(false);\n opciones$ = input<Observable<TabSeccion[]>>();\n modificarOpciones$ = input<Observable<{ [key: string]: any }>>();\n defaultTab = input<number>(0);\n\n /**\n * @deprecated Paradigma Zero-Output: Inyecta FiltroBusquedaService y usa `getFiltroSignal('nombreColeccion')` para estado en tiempo real, esto evita renderizados innecesarios del padre.\n */\n dataFiltro = output<any>();\n\n /**\n * @deprecated Su payload de diccionario crudo desaparecerá pronto (Mejora 2). Migra al nuevo evento `(buscar)` que emite la interfaz `FiltroResultante`.\n * Se mantiene temporalmente para componentes legacy.\n */\n resultados = output<any>();\n\n /**\n * Evento principal explícito de búsqueda (Click en Filtrar). Emite el objeto con metadata y labels.\n */\n buscar = output<FiltroResultante>();\n\n /**\n * @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.\n */\n cargaCompleta = output<boolean>();\n\n tabActual = signal<number>(0);\n dataOpcionesNuevo = signal<TabFiltroSeccion[]>([]);\n isCargaCompleta = signal<boolean>(false);\n\n frmFiltroBusqueda: FormGroup = this.fb.group({\n opcion: [0],\n opciones: this.fb.array([]),\n });\n\n get opcionesTabs() {\n return this.frmFiltroBusqueda.get('opciones') as FormArray;\n }\n\n get frmGroupSeleccionado(): FormGroup {\n return (this.opcionesTabs.at(this.tabActual()) as FormGroup) || this.fb.group({});\n }\n\n getControl(nombre: string): FormControl {\n return this.frmGroupSeleccionado.get(nombre) as FormControl;\n }\n\n getControlRaiz(nombre: string): FormControl {\n return this.frmFiltroBusqueda.get(nombre) as FormControl;\n }\n\n getAutocompleteLabel(controlData: CampoFiltro, value: any): string {\n if (!value) return '';\n const config = controlData.autocomplete;\n if (!config) return '';\n\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = dataEnLista(list, config.campoValor || controlData.campo, value);\n\n if (item) {\n return this.campoTextEval(controlData, item);\n }\n\n // Fallback search in the filtered results if not in the main list\n const filteredList = this.filtrados[controlData.campo] || [];\n const filteredItem = dataEnLista(filteredList, config.campoValor || controlData.campo, value);\n if (filteredItem) {\n return this.campoTextEval(controlData, filteredItem);\n }\n\n return value?.toString() || '';\n }\n\n dataServidor: DataServidor = {};\n dataServidorSuscripcion: { [key: string]: BehaviorSubject<any> } = {};\n filtrados: { [key: string]: any[] } = {};\n inputParaEnviarAutocomplete = new Subject<any>();\n\n private destroy$ = new Subject<void>();\n protected sufixTemporal = '_temporal';\n protected tipoValorFuncion = tipoValorFuncion;\n private fechaActual = moment().toDate();\n\n constructor() {\n this.inputParaEnviarAutocomplete.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe((param) => {\n this.queryService?.cargar(this, [param.reqQuery], param.reqData, false, this.prefijoConsulta()).then((dRet: any) => {\n if (dRet) {\n this.filtrados[param.controlData.campo] = dRet[param.reqQuery];\n this.filtroBusquedaService.setDataServidorSuscripcion(this.nombreColeccionInput(), param.controlData.campo, dRet[param.reqQuery]);\n }\n });\n });\n }\n\n ngOnInit() {\n this.tabActual.set(this.defaultTab());\n this.frmFiltroBusqueda.get('opcion')?.setValue(this.tabActual());\n\n if (this.opciones().length > 0) {\n this.initOpciones(this.opciones());\n }\n\n this.opciones$()?.pipe(takeUntil(this.destroy$)).subscribe(val => {\n if (val) this.initOpciones(val);\n });\n\n this.modificarOpciones$()?.pipe(takeUntil(this.destroy$)).subscribe(val => {\n if (val) {\n Object.keys(val).forEach(x => {\n const ev = val[x];\n this.actualizarEnFormArray(x, ev.value ?? ev['val'], { disabled: ev.disabled });\n });\n }\n });\n\n this.frmFiltroBusqueda.valueChanges.pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.actualizarEstadoService();\n });\n\n this.frmFiltroBusqueda.get('opcion')?.valueChanges.pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe((val) => {\n if (val !== null) {\n this.tabActual.set(val);\n this.cargarDatosFiltroNuevo(val);\n }\n });\n }\n\n private initOpciones(val: TabSeccion[]) {\n const nOpc = this.reorganizarOpcionesNuevas(val);\n this.dataOpcionesNuevo.set(nOpc);\n this.cargarDatosFiltroNuevo();\n }\n\n private reorganizarOpcionesNuevas(val: TabSeccion[]): TabFiltroSeccion[] {\n return val.filter(tab => !tab.esVisible || tipoValorFuncion(tab.esVisible, true, tab)).map(tab => ({\n label: tab.label,\n campos: tab.campos || []\n }));\n }\n\n async cargarDatosFiltroNuevo(idTab?: number) {\n const tabIdx = idTab !== undefined ? idTab : this.tabActual();\n const currentTab = this.dataOpcionesNuevo()[tabIdx];\n if (!currentTab) return;\n\n let llamadasJuntas: string[][] = [[], [], [], [], []];\n let llamadasJuntasParams: any[] = [{}, {}, {}, {}, {}];\n const camposDisabled: string[] = [];\n const camposRequired: string[] = [];\n\n const procesarCampos = (campos: CampoFiltro[], grupoFrm: any, agrupado = false) => {\n campos.forEach((campo) => {\n let val = campo;\n if (val.modificadorDatos) val = val.modificadorDatos(val);\n\n if (val.disabled) camposDisabled.push(val.campo);\n if (val.required) camposRequired.push(val.campo);\n\n if (val.dateRange) {\n const [fIni, fFin] = val.dateRange.campo!;\n grupoFrm[fIni] = val.dateRange.value?.[0] === '*fechaActual*' ? this.fechaActual : (val.dateRange.value?.[0] || '');\n grupoFrm[fFin] = val.dateRange.value?.[1] === '*fechaActual*' ? this.fechaActual : (val.dateRange.value?.[1] || '');\n } else if (val.autocomplete) {\n grupoFrm[val.campo + this.sufixTemporal] = val.value || '';\n grupoFrm[val.campo] = val.value || '';\n } else if (val.controlAgrupado) {\n grupoFrm[val.campo] = val.value || '';\n procesarCampos(val.controlAgrupado, grupoFrm, true);\n } else {\n grupoFrm[val.campo] = val.value === '*fechaActual*' ? this.fechaActual : (val.value || '');\n }\n\n if (val.select || val.autocomplete) {\n const config = (val.select || val.autocomplete)!;\n if (agrupado) config.ordenPeticion = 3;\n\n if (config.customData) {\n this.setCustomData(config.data!, config.customData);\n } else {\n const level = config.ordenPeticion || 0;\n if (config.data) llamadasJuntas[level].push(config.data);\n\n if (val.reqParams?.fields) {\n val.reqParams.fields.forEach(f => {\n if (grupoFrm[f] && !['*primero*', '*deUsuario*'].includes(grupoFrm[f])) {\n llamadasJuntasParams[level][f] = grupoFrm[f];\n }\n });\n }\n if (val.reqParams?.params) {\n llamadasJuntasParams[level] = { ...llamadasJuntasParams[level], ...val.reqParams.params };\n }\n }\n }\n });\n };\n\n const targetOpciones = idTab !== undefined ? [this.dataOpcionesNuevo()[idTab]] : this.dataOpcionesNuevo();\n targetOpciones.forEach(tab => {\n const grupoFrm: any = {};\n procesarCampos(tab.campos, grupoFrm);\n const group = this.fb.group(grupoFrm);\n\n if (idTab === undefined) {\n this.opcionesTabs.push(group);\n } else {\n this.opcionesTabs.setControl(idTab, group);\n }\n });\n\n getUniqueValues(camposDisabled).forEach(c => this.actualizarEnFormArray(c, undefined, { disabled: true }));\n establecerQuitarRequired(this.frmGroupSeleccionado, getUniqueValues(camposRequired));\n\n const cargaNivel = async (idx: number) => {\n const types = getUniqueValues(llamadasJuntas[idx]) as string[];\n if (types.length === 0) return;\n\n const dRet = await this.queryService?.cargar(this, types, llamadasJuntasParams[idx], false, this.prefijoConsulta());\n if (dRet) {\n this.procesarRetornoDatos(idx, dRet, llamadasJuntasParams);\n }\n };\n\n await cargaNivel(0);\n await cargaNivel(1);\n await cargaNivel(2);\n await cargaNivel(3);\n await cargaNivel(4);\n\n this.isCargaCompleta.set(true);\n this.actualizarEstadoService();\n this.cargaCompleta.emit(true);\n }\n\n private actualizarEstadoService() {\n if (this.isCargaCompleta()) {\n const res = this.getFiltroResultante();\n this.filtroBusquedaService.setValue(this.nombreColeccionInput(), res);\n this.dataFiltro.emit(res.datosFiltro);\n }\n }\n\n private setCustomData(key: string, data: any[]) {\n if (!this.dataServidorSuscripcion[key]) {\n this.dataServidorSuscripcion[key] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[key].next(data);\n }\n\n private procesarRetornoDatos(idxLevel: number, data: any, paramsRef: any[]) {\n const tabCampos = this.dataOpcionesNuevo()[this.tabActual()].campos;\n const affected = tabCampos.filter(c => {\n const config = c.select || c.autocomplete;\n return config && (config.ordenPeticion || 0) === idxLevel;\n });\n\n affected.forEach(campo => {\n const config = (campo.select || campo.autocomplete)!;\n const res = data[config.data!];\n\n if (!this.dataServidorSuscripcion[config.data!]) {\n this.dataServidorSuscripcion[config.data!] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[config.data!].next(res);\n this.filtroBusquedaService.setDataServidorSuscripcion(this.nombreColeccionInput(), campo.campo, res);\n\n if (campo.value === '*primero*' && res?.length > 0) {\n const firstVal = config.campoValor === '*objeto*' ? res[0] : res[0][config.campoValor || campo.campo];\n this.actualizarEnFormArray(campo.campo, firstVal);\n\n paramsRef.forEach((p, i) => {\n if (i > idxLevel && p[campo.campo] === '') p[campo.campo] = firstVal;\n });\n }\n\n if (campo.autocomplete) {\n this.filtrados[campo.campo] = res;\n }\n\n if (campo.change) {\n this.cambiarSeleccionNuevo(campo);\n }\n });\n }\n\n getFiltroResultante(): FiltroResultante {\n const rawForm = this.frmGroupSeleccionado.getRawValue();\n const datosFiltro: { [key: string]: any } = { opcion: this.tabActual() };\n const datosFiltroConLabel: DataFiltroAplicado[] = [];\n const resumenItems: string[] = [];\n\n const campos = this.dataOpcionesNuevo()[this.tabActual()]?.campos || [];\n\n const procesarMetadatos = (campo: CampoFiltro) => {\n const meta: DataFiltroAplicado = { campo: campo.campo, label: campo.label || '', value: null };\n\n if (campo.dateRange) {\n const [fIni, fFin] = campo.dateRange.campo!;\n datosFiltro[fIni] = rawForm[fIni] ? moment(rawForm[fIni]).format('YYYYMMDD') : '';\n datosFiltro[fFin] = rawForm[fFin] ? moment(rawForm[fFin]).format('YYYYMMDD') : '';\n if (rawForm[fIni] && rawForm[fFin]) {\n meta.value = `${moment(rawForm[fIni]).format('DD/MM/YYYY')} - ${moment(rawForm[fFin]).format('DD/MM/YYYY')}`;\n resumenItems.push(`${meta.label}: ${meta.value}`);\n }\n } else if (campo.control === 'date') {\n const val = rawForm[campo.campo];\n datosFiltro[campo.campo] = val ? moment(val).format('YYYYMMDD') : '';\n meta.value = val ? moment(val).format('DD/MM/YYYY') : '';\n if (meta.value) resumenItems.push(`${meta.label}: ${meta.value}`);\n } else if (campo.control === 'checkbox') {\n datosFiltro[campo.campo] = rawForm[campo.campo];\n meta.value = rawForm[campo.campo];\n if (meta.value) resumenItems.push(`${meta.label}`);\n } else {\n const val = rawForm[campo.campo];\n datosFiltro[campo.campo] = val;\n meta.value = val;\n\n if (campo.select || campo.autocomplete) {\n const config = (campo.select || campo.autocomplete)!;\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = config.campoValor === '*objeto*' ? val : dataEnLista(list, config.campoValor || campo.campo, val);\n if (item) {\n meta.list = list;\n meta.valueObject = item;\n meta.valueString = this.campoTextEval(campo, item);\n resumenItems.push(`${meta.label}: ${meta.valueString}`);\n }\n } else if (val !== null && val !== undefined && val !== '') {\n resumenItems.push(`${meta.label}: ${val}`);\n }\n }\n datosFiltroConLabel.push(meta);\n };\n\n campos.forEach(c => {\n if (c.controlAgrupado) {\n c.controlAgrupado.forEach(sub => procesarMetadatos(sub));\n } else {\n procesarMetadatos(c);\n }\n });\n\n const labelResumen = resumenItems.join(' | ');\n\n return { datosFiltro, datosFiltroConLabel, labelResumen };\n }\n\n mostrarValorEnBusqueda = mostrarValorEnBusqueda;\n\n campoValorEval(campoFiltro: CampoFiltro, itemSelect: any) {\n if (campoFiltro.select || campoFiltro.autocomplete) {\n const selectOrAutocomplete = campoFiltro.select ? campoFiltro.select : campoFiltro.autocomplete;\n if (selectOrAutocomplete?.campoValor === '*objeto*') {\n return itemSelect;\n }\n if (campoFiltro.campo === '*objeto*') {\n return itemSelect;\n }\n if (selectOrAutocomplete && itemSelect[selectOrAutocomplete.campoValor!] !== undefined) {\n return itemSelect[selectOrAutocomplete.campoValor!];\n }\n }\n return itemSelect[campoFiltro.campo];\n }\n\n campoTextEval(campoFiltro: CampoFiltro, itemSelect: any): string {\n if (campoFiltro.select || campoFiltro.autocomplete) {\n const selectOrAutocomplete = (campoFiltro.select || campoFiltro.autocomplete)!;\n if (selectOrAutocomplete.optionText) {\n return selectOrAutocomplete.optionText(itemSelect);\n }\n if (selectOrAutocomplete.camposText) {\n return selectOrAutocomplete.camposText.map(c => itemSelect[c]).join(' ');\n }\n return itemSelect[campoFiltro.campo];\n }\n return '';\n }\n\n concatenarCadenasArray(array: string | string[], objData: any) {\n if (typeof array === 'string') {\n return objData[array];\n }\n const nTxtArray: any[] = [];\n array.forEach(campo => {\n if (campo.charAt(0) === '*') {\n nTxtArray.push(campo.replace('*', ''));\n } else {\n nTxtArray.push(objData[campo]);\n }\n });\n return nTxtArray.join(' ');\n }\n\n filtrarData() {\n if (this.frmGroupSeleccionado.invalid) {\n const errors = getFormValidationErrors(this.frmGroupSeleccionado);\n const labels = errors.map(e => {\n const found = this.dataOpcionesNuevo()[this.tabActual()].campos.find(c => c.campo === e.control);\n return found?.label || e.control;\n });\n this.toastr.error(`Campos requeridos:<br>${labels.join(', ')}`, undefined, { enableHtml: true });\n return;\n }\n this.actualizarEstadoService();\n const res = this.getFiltroResultante();\n // Soporte temporal a usos actuales\n this.resultados.emit(res.datosFiltro);\n // Nueva mejora 2 (Emisión completa)\n this.buscar.emit(res);\n }\n\n actualizarEnFormArray(name: string, value: any, extra?: { disabled?: boolean }) {\n this.opcionesTabs.controls.forEach((control: any) => {\n const fc = control.get(name);\n if (fc) {\n if (value !== undefined) fc.setValue(value, { emitEvent: false });\n if (extra?.disabled === true) fc.disable();\n if (extra?.disabled === false) fc.enable();\n fc.updateValueAndValidity();\n }\n });\n }\n\n accionPosteriorCambioAutocomplete(controlData: CampoFiltro, valControl: any) {\n const list = this.dataServidorSuscripcion[controlData.autocomplete?.data!]?.getValue() || [];\n this.filtrados[controlData.campo] = list.filter((algo: any) => {\n let nTextVerif = this.concatenarCadenasArray(controlData.autocomplete?.camposText!, algo);\n if (controlData.autocomplete?.searchFields) {\n const nTextVerifExtra = this.concatenarCadenasArray(controlData.autocomplete.searchFields, algo);\n nTextVerif = nTextVerif.concat(nTextVerifExtra);\n }\n const textBuscar = valControl && typeof valControl === 'string' ? valControl.toLowerCase() : null;\n if (nTextVerif) {\n return nTextVerif.toLowerCase().includes(textBuscar) ? algo : null;\n }\n return null;\n });\n }\n\n cambiarNuevo(campo: CampoFiltro, val: any) {\n if (campo.autocomplete) {\n const valControl = this.frmGroupSeleccionado.get(campo.campo + this.sufixTemporal)?.value;\n if (!valControl) {\n this.filtrados[campo.campo] = this.dataServidorSuscripcion[campo.autocomplete.data!]?.getValue() || [];\n } else {\n const config = campo.autocomplete;\n if (config.campotxtBuscar && val && val.length > (config.campotxtBuscarLength || 3)) {\n const reqQuery = config.data!;\n let reqData: any = {};\n\n if (campo.reqParams?.fields) {\n campo.reqParams.fields.forEach(f => {\n const ctrl = this.buscarControl(f);\n reqData[ctrl?.aliasCampoEnviar || f] = this.frmGroupSeleccionado.get(f)?.value;\n });\n }\n reqData[config.campotxtBuscar || campo.campo] = val;\n if (campo.reqParams?.params) Object.assign(reqData, campo.reqParams.params);\n\n this.inputParaEnviarAutocomplete.next({ reqQuery, reqData, controlData: campo });\n } else {\n this.accionPosteriorCambioAutocomplete(campo, valControl);\n }\n }\n }\n }\n\n cambiarSeleccionNuevo(campo: CampoFiltro, event?: any) {\n const val = event?.option?.value ?? event?.value ?? (event?.target ? event.target.value : event);\n if (val !== undefined) {\n this.actualizarEnFormArray(campo.campo, val);\n\n if (campo.autocomplete) {\n const config = campo.autocomplete;\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = config.campoValor === '*objeto*' ? val : dataEnLista(list, config.campoValor || campo.campo, val);\n if (item) {\n const text = this.campoTextEval(campo, item);\n this.actualizarEnFormArray(campo.campo + this.sufixTemporal, text);\n }\n }\n\n const groupedMatch = this.dataOpcionesNuevo()[this.tabActual()].campos\n .filter(c => c.controlAgrupado)\n .find(c => c.controlAgrupado?.some(sub => sub.campo === campo.campo));\n if (groupedMatch) this.frmGroupSeleccionado.get(groupedMatch.campo)?.setValue(val);\n }\n\n if (campo.change?.filterFields) {\n campo.change.filterFields.forEach(target => {\n const targetMeta = this.buscarControl(target);\n if (targetMeta) {\n const params = this.generarParams(targetMeta, campo);\n this.actualizarEnFormArray(target, null);\n this.actualizarEnFormArray(target + this.sufixTemporal, null);\n this.dataServidorSuscripcion[target]?.next(null);\n\n const config = (targetMeta.select || targetMeta.autocomplete);\n if (config?.data) {\n this.queryService?.cargar(this, [config.data], params, false, this.prefijoConsulta()).then(d => {\n if (d) {\n const res = d[config.data!];\n this.actualizarEnFormArray(target, targetMeta.value || null);\n this.actualizarEnFormArray(target + this.sufixTemporal, targetMeta.value || null);\n if (!this.dataServidorSuscripcion[config.data!]) {\n this.dataServidorSuscripcion[config.data!] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[config.data!].next(res);\n this.filtrados[target] = res;\n }\n });\n }\n }\n });\n } else if (campo.change?.filter) {\n setTimeout(() => this.filtrarData(), 1);\n }\n }\n\n buscarControl(campo: string): CampoFiltro | undefined {\n const rootCampos = this.dataOpcionesNuevo()[this.tabActual()].campos;\n let found = rootCampos.find(c => c.campo === campo);\n if (!found) {\n found = rootCampos.filter(c => c.controlAgrupado).flatMap(c => c.controlAgrupado!).find(c => c.campo === campo);\n }\n return found;\n }\n\n generarParams(meta: CampoFiltro, trigger: CampoFiltro): any {\n const params: any = {};\n if (meta.reqParams?.fields) {\n meta.reqParams.fields.forEach(f => {\n const ctrl = this.buscarControl(f);\n params[ctrl?.aliasCampoEnviar || f] = this.frmGroupSeleccionado.get(f)?.value;\n });\n } else {\n params[meta.aliasCampoEnviar || trigger.campo || meta.campo] = this.frmGroupSeleccionado.get(trigger.campo || meta.campo)?.value;\n }\n if (meta.reqParams?.params) Object.assign(params, meta.reqParams.params);\n return params;\n }\n\n limpiarAutocomplete(campo: CampoFiltro, event: Event) {\n this.actualizarEnFormArray(campo.campo, '');\n this.actualizarEnFormArray(campo.campo + this.sufixTemporal, '');\n this.cambiarSeleccionNuevo(campo, { option: { value: '' } });\n event.preventDefault();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (isCargaCompleta()) {\n <div class=\"filtroBusqueda w-full\">\n <div class=\"border-none p-0 flex flex-col\">\n\n @if (dataOpcionesNuevo().length === 1) {\n <div class=\"flex-1 flex items-end max-sm:flex-col flex-wrap gap-2\">\n <ng-container [ngTemplateOutlet]=\"verOpcionesT\"></ng-container>\n </div>\n } @else if (dataOpcionesNuevo().length > 1) {\n <div class=\"flex-1 flex flex-col flex-wrap gap-2 border\">\n <mat-tab-group\n [selectedIndex]=\"tabActual()\"\n (selectedIndexChange)=\"getControlRaiz('opcion').setValue($event)\"\n class=\"flex-1 flex flex-wrap\"\n [mat-stretch-tabs]=\"false\"\n dynamicHeight\n mat-align-tabs=\"start\"\n >\n @for (item of dataOpcionesNuevo(); track $index) {\n <mat-tab [aria-label]=\"(tabActual() === $index) ? 'primary' : ''\">\n <ng-template mat-tab-label>\n @if (tabActual() === $index) {\n <mat-icon class=\"icon-xs\" svgIcon=\"roundVerified\"></mat-icon>\n }\n &nbsp;{{ item.label }}\n </ng-template>\n\n <div class=\"mx-2 mt-0 pt-0 flex flex-col items-end sm:flex-row flex-wrap gap-2\">\n <ng-container [ngTemplateOutlet]=\"verOpcionesT\"></ng-container>\n </div>\n </mat-tab>\n }\n </mat-tab-group>\n </div>\n }\n </div>\n </div>\n}\n\n<ng-template #verOpcionesT>\n @for (campo of dataOpcionesNuevo()[tabActual()]?.campos; track campo.campo) {\n <ng-container [ngTemplateOutletContext]=\"{controlData: campo}\" [ngTemplateOutlet]=\"controlesFormularioNuevo\"></ng-container>\n }\n <ng-container [ngTemplateOutlet]=\"botonFiltrar\"></ng-container>\n</ng-template>\n\n<ng-template #botonFiltrar>\n <button (click)=\"filtrarData()\"\n class=\"flex items-center justify-center bg-primary text-primary-contrast font-bold uppercase text-xs px-2 py-1 rounded shadow-md hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150\"\n matRipple type=\"button\"\n [disabled]=\"!isCargaCompleta()\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundFilterAlt\"></mat-icon>&nbsp;\n <span>Filtrar</span>\n </button>\n</ng-template>\n\n<ng-template #controlesFormularioNuevo let-controlData=\"controlData\">\n @switch (controlData.control) {\n @case ('controlAgrupado') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputControlAgrupado, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('select') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputSelect, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('autocomplete') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputAutocomplete, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('date') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputDate, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('date_range') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputDateRange, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('checkbox') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputCheckBox, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @default {\n @if (controlData.control === 'text' || controlData.control === 'number') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputTextNumber, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n }\n }\n</ng-template>\n\n<ng-template #contenedorInput let-template=\"template\" let-controlData=\"controlData\">\n <fieldset [class.flex-auto]=\"!controlData.cssClass\" [class]=\"controlData.cssClass\" class=\"appearance-none contenedorCampo relative\">\n <legend>\n <label [for]=\"controlData.campo\">{{ controlData.label }}@if(controlData.required){<span class=\"text-red-700 font-bold\"> *</span>}</label>\n </legend>\n <ng-container [ngTemplateOutletContext]=\"{controlData: controlData}\" [ngTemplateOutlet]=\"template\"></ng-container>\n </fieldset>\n</ng-template>\n\n<ng-template #inputSelect let-controlData=\"controlData\">\n <select [formControl]=\"getControl(controlData.campo)\"\n (change)=\"cambiarSeleccionNuevo(controlData, $event);\"\n [class]=\"controlData.select?.cssClass?.class\"\n [id]=\"controlData.campo\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n @if (controlData.select?.textoCuandoNulo) {\n <option value=\"\">{{ controlData.select?.textoCuandoNulo }}</option>\n }\n @for (itemSelect of dataServidorSuscripcion[controlData.select?.data!] | async; track $index) {\n <option [class]=\"controlData.select?.cssClass?.option\" [value]=\"campoValorEval(controlData, itemSelect)\">\n {{ campoTextEval(controlData, itemSelect) }}\n </option>\n }\n </select>\n</ng-template>\n\n<ng-template #inputControlAgrupado let-controlData=\"controlData\">\n <div class=\"flex items-center campos-container\">\n @for (sub of controlData.controlAgrupado; track sub.campo) {\n @switch (sub.control) {\n @case ('select') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputSelect\"></ng-container>\n }\n @case ('autocomplete') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputAutocomplete\"></ng-container>\n }\n @case ('date') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputDate\"></ng-container>\n }\n @case ('date_range') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputDateRange\"></ng-container>\n }\n @case ('checkbox') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputCheckBox\"></ng-container>\n }\n @default {\n @if (sub.control === 'text' || sub.control === 'number') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputTextNumber\"></ng-container>\n }\n }\n }\n }\n </div>\n</ng-template>\n\n<ng-template #inputAutocomplete let-controlData=\"controlData\">\n <div class=\"flex items-center formcontrol-container\">\n <input [formControl]=\"getControl(controlData.campo + sufixTemporal)\"\n (input)=\"cambiarNuevo(controlData, $any($event.target).value)\"\n [matAutocomplete]=\"auto\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.autocomplete?.textoCuandoNulo ?? controlData.label }}\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"cambiarSeleccionNuevo(controlData, $event)\"\n [panelWidth]=\"'auto'\"\n [displayWith]=\"getAutocompleteLabel.bind(this, controlData)\"\n >\n @for (itemSelect of filtrados[controlData.campo]; track $index) {\n <mat-option [class]=\"controlData.autocomplete?.cssClass?.option\" [value]=\"campoValorEval(controlData, itemSelect)\">\n @if (controlData.autocomplete?.optionInnerHtml) {\n <div [innerHTML]=\"controlData.autocomplete?.optionInnerHtml!(itemSelect)\"></div>\n } @else {\n {{ campoTextEval(controlData, itemSelect) }}\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n <div class=\"flex items-center justify-start\">\n <button (click)=\"limpiarAutocomplete(controlData, $event)\" class=\"boton-circular-gris\"\n matRipple\n type=\"button\"\n >\n <mat-icon [svgIcon]=\"(getControl(controlData.campo).value ? 'roundCancel' : 'roundSearch')\" class=\"icon-2xs\"></mat-icon>\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #inputTextNumber let-controlData=\"controlData\">\n <input (keyup.enter)=\"controlData.keyUpEnter ? filtrarData() : null\"\n [formControl]=\"getControl(controlData.campo)\"\n [type]=\"controlData.control\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.label }}\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n</ng-template>\n\n<ng-template #inputDate let-controlData=\"controlData\">\n <div class=\"flex items-center date-container\">\n <input (keyup.enter)=\"controlData.keyUpEnter ? filtrarData() : null\"\n [formControl]=\"getControl(controlData.campo)\"\n (dateChange)=\"cambiarSeleccionNuevo(controlData, $event)\"\n [matDatepicker]=\"i\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.label }}\"\n type=\"text\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n <mat-datepicker-toggle [for]=\"i\" class=\"icon-xs\" matSuffix></mat-datepicker-toggle>\n <mat-datepicker #i></mat-datepicker>\n </div>\n</ng-template>\n\n<ng-template #inputDateRange let-controlData=\"controlData\">\n <div class=\"flex items-center daterange-container\">\n <mat-date-range-input [rangePicker]=\"i\">\n <input [formControl]=\"getControl(controlData.dateRange?.campo![0])\" matStartDate placeholder=\"Desde\">\n <input [formControl]=\"getControl(controlData.dateRange?.campo![1])\" matEndDate placeholder=\"Hasta\">\n </mat-date-range-input>\n <mat-datepicker-toggle [for]=\"i\" class=\"icon-xs\"></mat-datepicker-toggle>\n <mat-date-range-picker #i></mat-date-range-picker>\n </div>\n</ng-template>\n\n<ng-template #inputCheckBox let-controlData=\"controlData\">\n <input [formControl]=\"getControl(controlData.campo)\"\n [id]=\"controlData.campo\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n type=\"checkbox\"\n (change)=\"cambiarSeleccionNuevo(controlData, $event)\"\n >\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKa,qBAAqB,CAAA;;AAExB,IAAA,eAAe,GAAG,MAAM,CAAmB,IAAI,GAAG,EAAE,CAAC;AACrD,IAAA,oBAAoB,GAAG,MAAM,CAAgC,IAAI,GAAG,EAAE,CAAC;;AAGxE,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAClD,IAAA,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;AAEnE;;AAEG;IACH,QAAQ,CAAC,YAAoB,EAAE,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAChC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC;AAC9B,YAAA,OAAO,OAAO;AAChB,SAAC,CAAC;;AAGJ;;;AAGG;AACH,IAAA,QAAQ,CAAC,YAAoB,EAAA;QAC3B,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;;AAGjD;;AAEG;AACH,IAAA,0BAA0B,CAAC,YAAoB,EAAE,KAAa,EAAE,IAAS,EAAA;AACvE,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,IAAG;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC5B,YAAA,IAAI,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,EAAe;AACnE,YAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;AACxC,YAAA,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;AAC9B,YAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC;AACxC,YAAA,OAAO,OAAO;AAChB,SAAC,CAAC;;AAGJ;;;AAGG;IACH,0BAA0B,CAAC,YAAoB,EAAE,KAAa,EAAA;AAC5D,QAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;;;AAKlE;;;;AAIG;IACH,eAAe,CAAU,YAAoB,EAAE,YAAgB,EAAA;QAC7D,OAAO,QAAQ,CAAC,MAAK;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;AACtD,YAAA,QAAQ,KAAK,IAAI,YAAY;AAC/B,SAAC,CAAC;;AAGJ;;;;;AAKG;AACH,IAAA,qBAAqB,CAAU,YAAoB,EAAE,KAAa,EAAE,YAAgB,EAAA;QAClF,OAAO,QAAQ,CAAC,MAAK;AACnB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AACvE,YAAA,QAAQ,KAAK,IAAI,YAAY;AAC/B,SAAC,CAAC;;wGA1EO,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCuBY,mBAAmB,GAAG,IAAI,cAAc,CAAgB,qBAAqB;MA2B7E,uBAAuB,CAAA;AAC1B,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAA,qBAAqB,GAA0B,MAAM,CAAC,qBAAqB,CAAC;IAC5E,YAAY,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAkB;AAEvF,IAAA,QAAQ,GAAG,KAAK,CAAe,EAAE,CAAC;AAClC,IAAA,oBAAoB,GAAG,KAAK,CAAS,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAC5F,IAAA,eAAe,GAAG,KAAK,CAAS,KAAK,CAAC;AACtC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,CAAC;IAC1C,SAAS,GAAG,KAAK,EAA4B;IAC7C,kBAAkB,GAAG,KAAK,EAAsC;AAChE,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,CAAC;AAE7B;;AAEG;IACH,UAAU,GAAG,MAAM,EAAO;AAE1B;;;AAGG;IACH,UAAU,GAAG,MAAM,EAAO;AAE1B;;AAEG;IACH,MAAM,GAAG,MAAM,EAAoB;AAEnC;;AAEG;IACH,aAAa,GAAG,MAAM,EAAW;AAEjC,IAAA,SAAS,GAAG,MAAM,CAAS,CAAC,CAAC;AAC7B,IAAA,iBAAiB,GAAG,MAAM,CAAqB,EAAE,CAAC;AAClD,IAAA,eAAe,GAAG,MAAM,CAAU,KAAK,CAAC;AAExC,IAAA,iBAAiB,GAAc,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5B,KAAA,CAAC;AAEF,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAc;;AAG5D,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAQ,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAe,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;;AAGnF,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAgB;;AAG7D,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAgB;;IAG1D,oBAAoB,CAAC,WAAwB,EAAE,KAAU,EAAA;AACvD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY;AACvC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;AAEtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACzE,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAE7E,IAAI,IAAI,EAAE;YACN,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC;;;AAIhD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE;AAC5D,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAC7F,IAAI,YAAY,EAAE;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC;;AAGxD,QAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;;IAGhC,YAAY,GAAiB,EAAE;IAC/B,uBAAuB,GAA4C,EAAE;IACrE,SAAS,GAA6B,EAAE;AACxC,IAAA,2BAA2B,GAAG,IAAI,OAAO,EAAO;AAExC,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAC5B,aAAa,GAAG,WAAW;IAC3B,gBAAgB,GAAG,gBAAgB;AACrC,IAAA,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE;AAEvC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CACnC,YAAY,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AACpB,YAAA,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,KAAI;gBACjH,IAAI,IAAI,EAAE;AACR,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAC9D,IAAI,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;AAErI,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGJ,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;;AAGpC,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAG;AAC/D,YAAA,IAAI,GAAG;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACjC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAG;YACxE,IAAI,GAAG,EAAE;gBACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;AAC3B,oBAAA,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;AACjF,iBAAC,CAAC;;AAEN,SAAC,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACtC,oBAAoB,EAAE,EACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,MAAK;YACf,IAAI,CAAC,uBAAuB,EAAE;AAChC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,IAAI,CACrD,oBAAoB,EAAE,EACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AAClB,YAAA,IAAI,GAAG,KAAK,IAAI,EAAE;AAChB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,gBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;;AAEpC,SAAC,CAAC;;AAGI,IAAA,YAAY,CAAC,GAAiB,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;AAChD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,sBAAsB,EAAE;;AAGvB,IAAA,yBAAyB,CAAC,GAAiB,EAAA;AACjD,QAAA,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;YACjG,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI;AACvB,SAAA,CAAC,CAAC;;IAGL,MAAM,sBAAsB,CAAC,KAAc,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,IAAI,cAAc,GAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACrD,QAAA,IAAI,oBAAoB,GAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACtD,MAAM,cAAc,GAAa,EAAE;QACnC,MAAM,cAAc,GAAa,EAAE;QAEnC,MAAM,cAAc,GAAG,CAAC,MAAqB,EAAE,QAAa,EAAE,QAAQ,GAAG,KAAK,KAAI;AAChF,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;gBACvB,IAAI,GAAG,GAAG,KAAK;gBACf,IAAI,GAAG,CAAC,gBAAgB;AAAE,oBAAA,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC;gBAEzD,IAAI,GAAG,CAAC,QAAQ;AAAE,oBAAA,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAChD,IAAI,GAAG,CAAC,QAAQ;AAAE,oBAAA,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAEhD,gBAAA,IAAI,GAAG,CAAC,SAAS,EAAE;oBACjB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAM;AACzC,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnH,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;;AAC9G,qBAAA,IAAI,GAAG,CAAC,YAAY,EAAE;AAC3B,oBAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;oBAC1D,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;;AAChC,qBAAA,IAAI,GAAG,CAAC,eAAe,EAAE;oBAC9B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;oBACrC,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;;qBAC9C;oBACL,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;;gBAG5F,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE;oBAClC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,YAAY,CAAE;AAChD,oBAAA,IAAI,QAAQ;AAAE,wBAAA,MAAM,CAAC,aAAa,GAAG,CAAC;AAEtC,oBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;wBACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAK,EAAE,MAAM,CAAC,UAAU,CAAC;;yBAC9C;AACL,wBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC;wBACvC,IAAI,MAAM,CAAC,IAAI;4BAAE,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAExD,wBAAA,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE;4BACzB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;gCAC/B,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;oCACtE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;;AAEhD,6BAAC,CAAC;;AAEJ,wBAAA,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE;AACzB,4BAAA,oBAAoB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;;;;AAIjG,aAAC,CAAC;AACJ,SAAC;QAED,MAAM,cAAc,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACzG,QAAA,cAAc,CAAC,OAAO,CAAC,GAAG,IAAG;YAC3B,MAAM,QAAQ,GAAQ,EAAE;AACxB,YAAA,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;AAErC,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;;iBACxB;gBACL,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;;AAE9C,SAAC,CAAC;QAEF,eAAe,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1G,wBAAwB,CAAC,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;AAEpF,QAAA,MAAM,UAAU,GAAG,OAAO,GAAW,KAAI;YACvC,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,CAAa;AAC9D,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE;YAExB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;YACnH,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,oBAAoB,CAAC;;AAE9D,SAAC;AAED,QAAA,MAAM,UAAU,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,UAAU,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,UAAU,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,UAAU,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,UAAU,CAAC,CAAC,CAAC;AAEnB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;IAGvB,uBAAuB,GAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AACxB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACtC,YAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,CAAC;YACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;;;IAInC,aAAa,CAAC,GAAW,EAAE,IAAW,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC;;QAEpE,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;AAGtC,IAAA,oBAAoB,CAAC,QAAgB,EAAE,IAAS,EAAE,SAAgB,EAAA;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM;QACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAG;YACpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,YAAY;YACzC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,QAAQ;AAC3D,SAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAG;YACvB,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAE;YACpD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAK,CAAC;YAE9B,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,EAAE;AAC/C,gBAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC;;AAE7E,YAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,YAAA,IAAI,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AAEpG,YAAA,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;AAClD,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,KAAK,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC;gBACrG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAEjD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;oBACzB,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAAE,wBAAA,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ;AACtE,iBAAC,CAAC;;AAGJ,YAAA,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG;;AAGnC,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE;AAChB,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;;AAErC,SAAC,CAAC;;IAGJ,mBAAmB,GAAA;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE;QACvD,MAAM,WAAW,GAA2B,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;QACxE,MAAM,mBAAmB,GAAyB,EAAE;QACpD,MAAM,YAAY,GAAa,EAAE;AAEjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,IAAI,EAAE;AAEvE,QAAA,MAAM,iBAAiB,GAAG,CAAC,KAAkB,KAAI;YAC/C,MAAM,IAAI,GAAuB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AAE9F,YAAA,IAAI,KAAK,CAAC,SAAS,EAAE;gBACnB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,KAAM;gBAC3C,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACjF,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACjF,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;AAClC,oBAAA,IAAI,CAAC,KAAK,GAAG,CAAA,EAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA,GAAA,EAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;AAC5G,oBAAA,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;;;AAE9C,iBAAA,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE;gBACnC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAChC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACpE,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;gBACxD,IAAI,IAAI,CAAC,KAAK;AAAE,oBAAA,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;;AAC5D,iBAAA,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE;AACvC,gBAAA,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC/C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBACjC,IAAI,IAAI,CAAC,KAAK;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAE,CAAA,CAAC;;iBAC7C;gBACL,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAChC,gBAAA,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG;AAC9B,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAG;gBAEhB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE;oBACtC,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAE;AACpD,oBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACzE,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,KAAK,UAAU,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;oBAC9G,IAAI,IAAI,EAAE;AACR,wBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,wBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;wBACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC;AAClD,wBAAA,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAA,CAAE,CAAC;;;AAEpD,qBAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE;oBAC1D,YAAY,CAAC,IAAI,CAAC,CAAG,EAAA,IAAI,CAAC,KAAK,CAAK,EAAA,EAAA,GAAG,CAAE,CAAA,CAAC;;;AAG9C,YAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,SAAC;AAED,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;AACjB,YAAA,IAAI,CAAC,CAAC,eAAe,EAAE;AACrB,gBAAA,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;;iBACnD;gBACL,iBAAiB,CAAC,CAAC,CAAC;;AAExB,SAAC,CAAC;QAEF,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAE7C,QAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE;;IAG3D,sBAAsB,GAAG,sBAAsB;IAE/C,cAAc,CAAC,WAAwB,EAAE,UAAe,EAAA;QACtD,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE;AAClD,YAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,YAAY;AAC/F,YAAA,IAAI,oBAAoB,EAAE,UAAU,KAAK,UAAU,EAAE;AACnD,gBAAA,OAAO,UAAU;;AAEnB,YAAA,IAAI,WAAW,CAAC,KAAK,KAAK,UAAU,EAAE;AACpC,gBAAA,OAAO,UAAU;;YAEnB,IAAI,oBAAoB,IAAI,UAAU,CAAC,oBAAoB,CAAC,UAAW,CAAC,KAAK,SAAS,EAAE;AACtF,gBAAA,OAAO,UAAU,CAAC,oBAAoB,CAAC,UAAW,CAAC;;;AAGvD,QAAA,OAAO,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;;IAGtC,aAAa,CAAC,WAAwB,EAAE,UAAe,EAAA;QACrD,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE;YAClD,MAAM,oBAAoB,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,YAAY,CAAE;AAC9E,YAAA,IAAI,oBAAoB,CAAC,UAAU,EAAE;AACnC,gBAAA,OAAO,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;;AAEpD,YAAA,IAAI,oBAAoB,CAAC,UAAU,EAAE;gBACnC,OAAO,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;AAE1E,YAAA,OAAO,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;;AAEtC,QAAA,OAAO,EAAE;;IAGX,sBAAsB,CAAC,KAAwB,EAAE,OAAY,EAAA;AAC3D,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,OAAO,CAAC,KAAK,CAAC;;QAEvB,MAAM,SAAS,GAAU,EAAE;AAC3B,QAAA,KAAK,CAAC,OAAO,CAAC,KAAK,IAAG;YACpB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC3B,gBAAA,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;;iBACjC;gBACL,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;;AAElC,SAAC,CAAC;AACF,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;;IAG5B,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;YACrC,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,oBAAoB,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAG;AAC5B,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,CAAC;AAChG,gBAAA,OAAO,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO;AAClC,aAAC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAyB,sBAAA,EAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAChG;;QAEF,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,EAAE;;QAEtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;;AAErC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGvB,IAAA,qBAAqB,CAAC,IAAY,EAAE,KAAU,EAAE,KAA8B,EAAA;QAC5E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAY,KAAI;YAClD,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B,IAAI,EAAE,EAAE;gBACN,IAAI,KAAK,KAAK,SAAS;oBAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACjE,gBAAA,IAAI,KAAK,EAAE,QAAQ,KAAK,IAAI;oBAAE,EAAE,CAAC,OAAO,EAAE;AAC1C,gBAAA,IAAI,KAAK,EAAE,QAAQ,KAAK,KAAK;oBAAE,EAAE,CAAC,MAAM,EAAE;gBAC1C,EAAE,CAAC,sBAAsB,EAAE;;AAE/B,SAAC,CAAC;;IAGJ,iCAAiC,CAAC,WAAwB,EAAE,UAAe,EAAA;AACzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,YAAY,EAAE,IAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC5F,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;AAC5D,YAAA,IAAI,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,YAAY,EAAE,UAAW,EAAE,IAAI,CAAC;AACzF,YAAA,IAAI,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE;AAC1C,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC;AAChG,gBAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;;AAEjD,YAAA,MAAM,UAAU,GAAG,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,IAAI;YACjG,IAAI,UAAU,EAAE;AACd,gBAAA,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI;;AAEpE,YAAA,OAAO,IAAI;AACb,SAAC,CAAC;;IAGJ,YAAY,CAAC,KAAkB,EAAE,GAAQ,EAAA;AACvC,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK;YACzF,IAAI,CAAC,UAAU,EAAE;gBACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,YAAY,CAAC,IAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;iBACjG;AACL,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY;AACjC,gBAAA,IAAI,MAAM,CAAC,cAAc,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,oBAAoB,IAAI,CAAC,CAAC,EAAE;AACnF,oBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAK;oBAC7B,IAAI,OAAO,GAAQ,EAAE;AAErB,oBAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;wBAC3B,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;4BACjC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAClC,4BAAA,OAAO,CAAC,IAAI,EAAE,gBAAgB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;AAChF,yBAAC,CAAC;;oBAEJ,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG;AACnD,oBAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM;wBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;AAE3E,oBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;;qBAC3E;AACL,oBAAA,IAAI,CAAC,iCAAiC,CAAC,KAAK,EAAE,UAAU,CAAC;;;;;IAMjE,qBAAqB,CAAC,KAAkB,EAAE,KAAW,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AAChG,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;YACrB,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AAE5C,YAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY;AACjC,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACzE,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,KAAK,UAAU,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC9G,IAAI,IAAI,EAAE;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC;AAC5C,oBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;;;AAItE,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;iBAC7D,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe;iBAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AACvE,YAAA,IAAI,YAAY;AAAE,gBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;;AAGpF,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE;YAC9B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,IAAG;gBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC7C,IAAI,UAAU,EAAE;oBACd,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;AACpD,oBAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;oBACxC,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;oBAC7D,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;oBAEhD,MAAM,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC;AAC5D,oBAAA,IAAI,MAAM,EAAE,IAAI,EAAE;wBACjB,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAG;4BAC7F,IAAI,CAAC,EAAE;gCACL,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC;gCAC3B,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC;AAC5D,gCAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC;gCACjF,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,EAAE;AAC/C,oCAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC;;AAE7E,gCAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,gCAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG;;AAEhC,yBAAC,CAAC;;;AAGR,aAAC,CAAC;;AACG,aAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE;YAC/B,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;;;AAI3C,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM;AACpE,QAAA,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,eAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;;AAEjH,QAAA,OAAO,KAAK;;IAGd,aAAa,CAAC,IAAiB,EAAE,OAAoB,EAAA;QACnD,MAAM,MAAM,GAAQ,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE;YAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAClC,gBAAA,MAAM,CAAC,IAAI,EAAE,gBAAgB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;AAC/E,aAAC,CAAC;;aACG;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK;;AAElI,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACxE,QAAA,OAAO,MAAM;;IAGf,mBAAmB,CAAC,KAAkB,EAAE,KAAY,EAAA;QAClD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5D,KAAK,CAAC,cAAc,EAAE;;IAGxB,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;wGA3jBf,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,ECtDpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6yWAsOA,EDrMI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qIAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,qBAAqB,EACrB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,OAAA,EAAA,8BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,8BACjB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,KAAA,EAAA,KAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,6vBACb,eAAe,EAAA,CAAA,EAAA,CAAA;;4FAON,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAzBnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,qBAAqB;wBACrB,iBAAiB;wBACjB,mBAAmB;wBACnB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,cAAc;wBACd,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,eAAe;qBAChB,EAEK,IAAA,EAAA;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC3B,qBAAA,EAAA,QAAA,EAAA,6yWAAA,EAAA;;;AEpDH;;AAEG;;;;"}
1
+ {"version":3,"file":"jvsoft-components-filtro-busqueda.mjs","sources":["../../../projects/components/filtro-busqueda/filtro-busqueda.service.ts","../../../projects/components/filtro-busqueda/filtro-busqueda.component.ts","../../../projects/components/filtro-busqueda/filtro-busqueda.component.html","../../../projects/components/filtro-busqueda/jvsoft-components-filtro-busqueda.ts"],"sourcesContent":["import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FiltroBusquedaService {\n // Estado centralizado con Signals (Angular 19+)\n private _filtrosActivos = signal<Map<string, any>>(new Map());\n private _dataServidorActivos = signal<Map<string, Map<string, any>>>(new Map());\n\n // Interfaz de sólo lectura expuesta\n public filtrosActivos = this._filtrosActivos.asReadonly();\n public dataServidorActivos = this._dataServidorActivos.asReadonly();\n\n /**\n * Establece un valor para un filtro reactivo\n */\n setValue(nombreFiltro: string, val: any) {\n this._filtrosActivos.update(map => {\n const nextMap = new Map(map);\n nextMap.set(nombreFiltro, val);\n return nextMap;\n });\n }\n\n /**\n * @deprecated Usa `getFiltroSignal(nombreFiltro)` en componentes modernos.\n * Retorna el snapshot sincrónico actual (para componentes legacy).\n */\n getValue(nombreFiltro: string) {\n return this._filtrosActivos().get(nombreFiltro);\n }\n\n /**\n * Actualiza la metadata del servidor (Signals).\n */\n setDataServidorSuscripcion(nombreFiltro: string, campo: string, data: any) {\n this._dataServidorActivos.update(map => {\n const nextMap = new Map(map);\n let filterMap = nextMap.get(nombreFiltro) || new Map<string, any>();\n const nextFilterMap = new Map(filterMap);\n nextFilterMap.set(campo, data);\n nextMap.set(nombreFiltro, nextFilterMap);\n return nextMap;\n });\n }\n\n /**\n * @deprecated Usa `getDataServidorSignal(nombreFiltro, campo)` en componentes modernos.\n * Retorna el snapshot sincrónico actual de metadata (para componentes legacy).\n */\n getDataServidorSuscripcion(nombreFiltro: string, campo: string) {\n return this._dataServidorActivos().get(nombreFiltro)?.get(campo);\n }\n\n // --- Opciones Signal (Angular 19+) ---\n\n /**\n * Crea y devuelve un Signal reactivo continuo para observar los valores aplicados de un filtro particular.\n * @param nombreFiltro Nombre del filtro que se desea escuchar\n * @param defaultValue Valor de respaldo seguro si aún no se ha inicializado el filtro.\n */\n getFiltroSignal<T = any>(nombreFiltro: string, defaultValue?: T) {\n return computed(() => {\n const value = this._filtrosActivos().get(nombreFiltro);\n return (value ?? defaultValue) as T;\n });\n }\n\n /**\n * Crea y devuelve un Signal reactivo continuo para escuchar la metadata/catálogo recibida del backend para un campo.\n * @param nombreFiltro Nombre de la colección del filtro principal\n * @param campo Campo específico (ej: id_usuario, categoria) del que se espera escuchar la lista u objeto servidor\n * @param defaultValue Valor de respaldo seguro si aún no hay data del servidor.\n */\n getDataServidorSignal<T = any>(nombreFiltro: string, campo: string, defaultValue?: T) {\n return computed(() => {\n const value = this._dataServidorActivos().get(nombreFiltro)?.get(campo);\n return (value ?? defaultValue) as T;\n });\n }\n}\n","import {Component, inject, InjectionToken, input, OnDestroy, OnInit, output, signal} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport { format } from 'date-fns';\nimport {FormArray, FormBuilder, FormControl, FormGroup, FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatDatepickerModule} from '@angular/material/datepicker';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatOptionModule, MatRippleModule} from '@angular/material/core';\nimport {MatRadioModule} from '@angular/material/radio';\nimport {MatSelectModule} from '@angular/material/select';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {TextFieldModule} from '@angular/cdk/text-field';\nimport {debounceTime, distinctUntilChanged, takeUntil} from 'rxjs/operators';\nimport {ToastrService} from 'ngx-toastr';\n\nimport {dataEnLista, DataServidor, establecerQuitarRequired, generateRandomString, getFormValidationErrors, getUniqueValues, mostrarValorEnBusqueda, tipoValorFuncion} from '@jvsoft/utils';\n\nimport {FiltroBusquedaService} from './filtro-busqueda.service';\nimport {CampoFiltro, DataFiltroAplicado, FiltroResultante, TabFiltroSeccion, TabSeccion} from './interfaces/filtro-busqueda.interface';\n\nexport interface IQueryService {\n cargar(objThis: any, reqArray: string[], data: any, anonimo: boolean, prefix: string ): Promise<any>;\n}\nexport const QUERY_SERVICE_TOKEN = new InjectionToken<IQueryService>('QUERY_SERVICE_TOKEN');\n\n@Component({\n selector: 'jvs-filtro-busqueda',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatOptionModule,\n MatRadioModule,\n MatRippleModule,\n MatSelectModule,\n MatTabsModule,\n TextFieldModule,\n ],\n templateUrl: './filtro-busqueda.component.html',\n host: {\n class: 'jvsFiltroBusqueda',\n },\n})\nexport class FiltroBusquedaComponent implements OnInit, OnDestroy {\n private fb = inject(FormBuilder);\n private toastr = inject(ToastrService);\n private filtroBusquedaService: FiltroBusquedaService = inject(FiltroBusquedaService);\n private queryService = inject(QUERY_SERVICE_TOKEN, { optional: true }) as IQueryService;\n\n opciones = input<TabSeccion[]>([]);\n nombreColeccionInput = input<string>(generateRandomString(10), { alias: 'nombreColeccion' });\n prefijoConsulta = input<string>('grl');\n busquedaAutomatica = input<boolean>(false);\n opciones$ = input<Observable<TabSeccion[]>>();\n modificarOpciones$ = input<Observable<{ [key: string]: any }>>();\n defaultTab = input<number>(0);\n\n /**\n * @deprecated Paradigma Zero-Output: Inyecta FiltroBusquedaService y usa `getFiltroSignal('nombreColeccion')` para estado en tiempo real, esto evita renderizados innecesarios del padre.\n */\n dataFiltro = output<any>();\n\n /**\n * @deprecated Su payload de diccionario crudo desaparecerá pronto (Mejora 2). Migra al nuevo evento `(buscar)` que emite la interfaz `FiltroResultante`.\n * Se mantiene temporalmente para componentes legacy.\n */\n resultados = output<any>();\n\n /**\n * Evento principal explícito de búsqueda (Click en Filtrar). Emite el objeto con metadata y labels.\n */\n buscar = output<FiltroResultante>();\n\n /**\n * @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.\n */\n cargaCompleta = output<boolean>();\n\n tabActual = signal<number>(0);\n dataOpcionesNuevo = signal<TabFiltroSeccion[]>([]);\n isCargaCompleta = signal<boolean>(false);\n\n frmFiltroBusqueda: FormGroup = this.fb.group({\n opcion: [0],\n opciones: this.fb.array([]),\n });\n\n get opcionesTabs() {\n return this.frmFiltroBusqueda.get('opciones') as FormArray;\n }\n\n get frmGroupSeleccionado(): FormGroup {\n return (this.opcionesTabs.at(this.tabActual()) as FormGroup) || this.fb.group({});\n }\n\n getControl(nombre: string): FormControl {\n return this.frmGroupSeleccionado.get(nombre) as FormControl;\n }\n\n getControlRaiz(nombre: string): FormControl {\n return this.frmFiltroBusqueda.get(nombre) as FormControl;\n }\n\n getAutocompleteLabel(controlData: CampoFiltro, value: any): string {\n if (!value) return '';\n const config = controlData.autocomplete;\n if (!config) return '';\n\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = dataEnLista(list, config.campoValor || controlData.campo, value);\n\n if (item) {\n return this.campoTextEval(controlData, item);\n }\n\n // Fallback search in the filtered results if not in the main list\n const filteredList = this.filtrados[controlData.campo] || [];\n const filteredItem = dataEnLista(filteredList, config.campoValor || controlData.campo, value);\n if (filteredItem) {\n return this.campoTextEval(controlData, filteredItem);\n }\n\n return value?.toString() || '';\n }\n\n dataServidor: DataServidor = {};\n dataServidorSuscripcion: { [key: string]: BehaviorSubject<any> } = {};\n filtrados: { [key: string]: any[] } = {};\n inputParaEnviarAutocomplete = new Subject<any>();\n\n private destroy$ = new Subject<void>();\n protected sufixTemporal = '_temporal';\n protected tipoValorFuncion = tipoValorFuncion;\n private fechaActual = new Date();\n\n constructor() {\n this.inputParaEnviarAutocomplete.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe((param) => {\n this.queryService?.cargar(this, [param.reqQuery], param.reqData, false, this.prefijoConsulta()).then((dRet: any) => {\n if (dRet) {\n this.filtrados[param.controlData.campo] = dRet[param.reqQuery];\n this.filtroBusquedaService.setDataServidorSuscripcion(this.nombreColeccionInput(), param.controlData.campo, dRet[param.reqQuery]);\n }\n });\n });\n }\n\n ngOnInit() {\n this.tabActual.set(this.defaultTab());\n this.frmFiltroBusqueda.get('opcion')?.setValue(this.tabActual());\n\n if (this.opciones().length > 0) {\n this.initOpciones(this.opciones());\n }\n\n this.opciones$()?.pipe(takeUntil(this.destroy$)).subscribe(val => {\n if (val) this.initOpciones(val);\n });\n\n this.modificarOpciones$()?.pipe(takeUntil(this.destroy$)).subscribe(val => {\n if (val) {\n Object.keys(val).forEach(x => {\n const ev = val[x];\n this.actualizarEnFormArray(x, ev.value ?? ev['val'], { disabled: ev.disabled });\n });\n }\n });\n\n this.frmFiltroBusqueda.valueChanges.pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.actualizarEstadoService();\n });\n\n this.frmFiltroBusqueda.get('opcion')?.valueChanges.pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe((val) => {\n if (val !== null) {\n this.tabActual.set(val);\n this.cargarDatosFiltroNuevo(val);\n }\n });\n }\n\n private initOpciones(val: TabSeccion[]) {\n const nOpc = this.reorganizarOpcionesNuevas(val);\n this.dataOpcionesNuevo.set(nOpc);\n this.cargarDatosFiltroNuevo();\n }\n\n private reorganizarOpcionesNuevas(val: TabSeccion[]): TabFiltroSeccion[] {\n return val.filter(tab => !tab.esVisible || tipoValorFuncion(tab.esVisible, true, tab)).map(tab => ({\n label: tab.label,\n campos: tab.campos || []\n }));\n }\n\n async cargarDatosFiltroNuevo(idTab?: number) {\n const tabIdx = idTab !== undefined ? idTab : this.tabActual();\n const currentTab = this.dataOpcionesNuevo()[tabIdx];\n if (!currentTab) return;\n\n let llamadasJuntas: string[][] = [[], [], [], [], []];\n let llamadasJuntasParams: any[] = [{}, {}, {}, {}, {}];\n const camposDisabled: string[] = [];\n const camposRequired: string[] = [];\n\n const procesarCampos = (campos: CampoFiltro[], grupoFrm: any, agrupado = false) => {\n campos.forEach((campo) => {\n let val = campo;\n if (val.modificadorDatos) val = val.modificadorDatos(val);\n\n if (val.disabled) camposDisabled.push(val.campo);\n if (val.required) camposRequired.push(val.campo);\n\n if (val.dateRange) {\n const [fIni, fFin] = val.dateRange.campo!;\n grupoFrm[fIni] = val.dateRange.value?.[0] === '*fechaActual*' ? this.fechaActual : (val.dateRange.value?.[0] || '');\n grupoFrm[fFin] = val.dateRange.value?.[1] === '*fechaActual*' ? this.fechaActual : (val.dateRange.value?.[1] || '');\n } else if (val.autocomplete) {\n grupoFrm[val.campo + this.sufixTemporal] = val.value || '';\n grupoFrm[val.campo] = val.value || '';\n } else if (val.controlAgrupado) {\n grupoFrm[val.campo] = val.value || '';\n procesarCampos(val.controlAgrupado, grupoFrm, true);\n } else {\n grupoFrm[val.campo] = val.value === '*fechaActual*' ? this.fechaActual : (val.value || '');\n }\n\n if (val.select || val.autocomplete) {\n const config = (val.select || val.autocomplete)!;\n if (agrupado) config.ordenPeticion = 3;\n\n if (config.customData) {\n this.setCustomData(config.data!, config.customData);\n } else {\n const level = config.ordenPeticion || 0;\n if (config.data) llamadasJuntas[level].push(config.data);\n\n if (val.reqParams?.fields) {\n val.reqParams.fields.forEach(f => {\n if (grupoFrm[f] && !['*primero*', '*deUsuario*'].includes(grupoFrm[f])) {\n llamadasJuntasParams[level][f] = grupoFrm[f];\n }\n });\n }\n if (val.reqParams?.params) {\n llamadasJuntasParams[level] = { ...llamadasJuntasParams[level], ...val.reqParams.params };\n }\n }\n }\n });\n };\n\n const targetOpciones = idTab !== undefined ? [this.dataOpcionesNuevo()[idTab]] : this.dataOpcionesNuevo();\n targetOpciones.forEach(tab => {\n const grupoFrm: any = {};\n procesarCampos(tab.campos, grupoFrm);\n const group = this.fb.group(grupoFrm);\n\n if (idTab === undefined) {\n this.opcionesTabs.push(group);\n } else {\n this.opcionesTabs.setControl(idTab, group);\n }\n });\n\n getUniqueValues(camposDisabled).forEach(c => this.actualizarEnFormArray(c, undefined, { disabled: true }));\n establecerQuitarRequired(this.frmGroupSeleccionado, getUniqueValues(camposRequired));\n\n const cargaNivel = async (idx: number) => {\n const types = getUniqueValues(llamadasJuntas[idx]) as string[];\n if (types.length === 0) return;\n\n const dRet = await this.queryService?.cargar(this, types, llamadasJuntasParams[idx], false, this.prefijoConsulta());\n if (dRet) {\n this.procesarRetornoDatos(idx, dRet, llamadasJuntasParams);\n }\n };\n\n await cargaNivel(0);\n await cargaNivel(1);\n await cargaNivel(2);\n await cargaNivel(3);\n await cargaNivel(4);\n\n this.isCargaCompleta.set(true);\n this.actualizarEstadoService();\n this.cargaCompleta.emit(true);\n }\n\n private actualizarEstadoService() {\n if (this.isCargaCompleta()) {\n const res = this.getFiltroResultante();\n this.filtroBusquedaService.setValue(this.nombreColeccionInput(), res);\n this.dataFiltro.emit(res.datosFiltro);\n }\n }\n\n private setCustomData(key: string, data: any[]) {\n if (!this.dataServidorSuscripcion[key]) {\n this.dataServidorSuscripcion[key] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[key].next(data);\n }\n\n private procesarRetornoDatos(idxLevel: number, data: any, paramsRef: any[]) {\n const tabCampos = this.dataOpcionesNuevo()[this.tabActual()].campos;\n const affected = tabCampos.filter(c => {\n const config = c.select || c.autocomplete;\n return config && (config.ordenPeticion || 0) === idxLevel;\n });\n\n affected.forEach(campo => {\n const config = (campo.select || campo.autocomplete)!;\n const res = data[config.data!];\n\n if (!this.dataServidorSuscripcion[config.data!]) {\n this.dataServidorSuscripcion[config.data!] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[config.data!].next(res);\n this.filtroBusquedaService.setDataServidorSuscripcion(this.nombreColeccionInput(), campo.campo, res);\n\n if (campo.value === '*primero*' && res?.length > 0) {\n const firstVal = config.campoValor === '*objeto*' ? res[0] : res[0][config.campoValor || campo.campo];\n this.actualizarEnFormArray(campo.campo, firstVal);\n\n paramsRef.forEach((p, i) => {\n if (i > idxLevel && p[campo.campo] === '') p[campo.campo] = firstVal;\n });\n }\n\n if (campo.autocomplete) {\n this.filtrados[campo.campo] = res;\n }\n\n if (campo.change) {\n this.cambiarSeleccionNuevo(campo);\n }\n });\n }\n\n getFiltroResultante(): FiltroResultante {\n const rawForm = this.frmGroupSeleccionado.getRawValue();\n const datosFiltro: { [key: string]: any } = { opcion: this.tabActual() };\n const datosFiltroConLabel: DataFiltroAplicado[] = [];\n const resumenItems: string[] = [];\n\n const campos = this.dataOpcionesNuevo()[this.tabActual()]?.campos || [];\n\n const procesarMetadatos = (campo: CampoFiltro) => {\n const meta: DataFiltroAplicado = { campo: campo.campo, label: campo.label || '', value: null };\n\n if (campo.dateRange) {\n const [fIni, fFin] = campo.dateRange.campo!;\n datosFiltro[fIni] = rawForm[fIni] ? format(rawForm[fIni], 'yyyyMMdd') : '';\n datosFiltro[fFin] = rawForm[fFin] ? format(rawForm[fFin], 'yyyyMMdd') : '';\n if (rawForm[fIni] && rawForm[fFin]) {\n meta.value = `${format(rawForm[fIni], 'dd/MM/yyyy')} - ${format(rawForm[fFin], 'dd/MM/yyyy')}`;\n resumenItems.push(`${meta.label}: ${meta.value}`);\n }\n } else if (campo.control === 'date') {\n const val = rawForm[campo.campo];\n datosFiltro[campo.campo] = val ? format(val, 'yyyyMMdd') : '';\n meta.value = val ? format(val, 'dd/MM/yyyy') : '';\n if (meta.value) resumenItems.push(`${meta.label}: ${meta.value}`);\n } else if (campo.control === 'checkbox') {\n datosFiltro[campo.campo] = rawForm[campo.campo];\n meta.value = rawForm[campo.campo];\n if (meta.value) resumenItems.push(`${meta.label}`);\n } else {\n const val = rawForm[campo.campo];\n datosFiltro[campo.campo] = val;\n meta.value = val;\n\n if (campo.select || campo.autocomplete) {\n const config = (campo.select || campo.autocomplete)!;\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = config.campoValor === '*objeto*' ? val : dataEnLista(list, config.campoValor || campo.campo, val);\n if (item) {\n meta.list = list;\n meta.valueObject = item;\n meta.valueString = this.campoTextEval(campo, item);\n resumenItems.push(`${meta.label}: ${meta.valueString}`);\n }\n } else if (val !== null && val !== undefined && val !== '') {\n resumenItems.push(`${meta.label}: ${val}`);\n }\n }\n datosFiltroConLabel.push(meta);\n };\n\n campos.forEach(c => {\n if (c.controlAgrupado) {\n c.controlAgrupado.forEach(sub => procesarMetadatos(sub));\n } else {\n procesarMetadatos(c);\n }\n });\n\n const labelResumen = resumenItems.join(' | ');\n\n return { datosFiltro, datosFiltroConLabel, labelResumen };\n }\n\n mostrarValorEnBusqueda = mostrarValorEnBusqueda;\n\n campoValorEval(campoFiltro: CampoFiltro, itemSelect: any) {\n if (campoFiltro.select || campoFiltro.autocomplete) {\n const selectOrAutocomplete = campoFiltro.select ? campoFiltro.select : campoFiltro.autocomplete;\n if (selectOrAutocomplete?.campoValor === '*objeto*') {\n return itemSelect;\n }\n if (campoFiltro.campo === '*objeto*') {\n return itemSelect;\n }\n if (selectOrAutocomplete && itemSelect[selectOrAutocomplete.campoValor!] !== undefined) {\n return itemSelect[selectOrAutocomplete.campoValor!];\n }\n }\n return itemSelect[campoFiltro.campo];\n }\n\n campoTextEval(campoFiltro: CampoFiltro, itemSelect: any): string {\n if (campoFiltro.select || campoFiltro.autocomplete) {\n const selectOrAutocomplete = (campoFiltro.select || campoFiltro.autocomplete)!;\n if (selectOrAutocomplete.optionText) {\n return selectOrAutocomplete.optionText(itemSelect);\n }\n if (selectOrAutocomplete.camposText) {\n return selectOrAutocomplete.camposText.map(c => itemSelect[c]).join(' ');\n }\n return itemSelect[campoFiltro.campo];\n }\n return '';\n }\n\n concatenarCadenasArray(array: string | string[], objData: any) {\n if (typeof array === 'string') {\n return objData[array];\n }\n const nTxtArray: any[] = [];\n array.forEach(campo => {\n if (campo.charAt(0) === '*') {\n nTxtArray.push(campo.replace('*', ''));\n } else {\n nTxtArray.push(objData[campo]);\n }\n });\n return nTxtArray.join(' ');\n }\n\n filtrarData() {\n if (this.frmGroupSeleccionado.invalid) {\n const errors = getFormValidationErrors(this.frmGroupSeleccionado);\n const labels = errors.map(e => {\n const found = this.dataOpcionesNuevo()[this.tabActual()].campos.find(c => c.campo === e.control);\n return found?.label || e.control;\n });\n this.toastr.error(`Campos requeridos:<br>${labels.join(', ')}`, undefined, { enableHtml: true });\n return;\n }\n this.actualizarEstadoService();\n const res = this.getFiltroResultante();\n // Soporte temporal a usos actuales\n this.resultados.emit(res.datosFiltro);\n // Nueva mejora 2 (Emisión completa)\n this.buscar.emit(res);\n }\n\n actualizarEnFormArray(name: string, value: any, extra?: { disabled?: boolean }) {\n this.opcionesTabs.controls.forEach((control: any) => {\n const fc = control.get(name);\n if (fc) {\n if (value !== undefined) fc.setValue(value, { emitEvent: false });\n if (extra?.disabled === true) fc.disable();\n if (extra?.disabled === false) fc.enable();\n fc.updateValueAndValidity();\n }\n });\n }\n\n accionPosteriorCambioAutocomplete(controlData: CampoFiltro, valControl: any) {\n const list = this.dataServidorSuscripcion[controlData.autocomplete?.data!]?.getValue() || [];\n this.filtrados[controlData.campo] = list.filter((algo: any) => {\n let nTextVerif = this.concatenarCadenasArray(controlData.autocomplete?.camposText!, algo);\n if (controlData.autocomplete?.searchFields) {\n const nTextVerifExtra = this.concatenarCadenasArray(controlData.autocomplete.searchFields, algo);\n nTextVerif = nTextVerif.concat(nTextVerifExtra);\n }\n const textBuscar = valControl && typeof valControl === 'string' ? valControl.toLowerCase() : null;\n if (nTextVerif) {\n return nTextVerif.toLowerCase().includes(textBuscar) ? algo : null;\n }\n return null;\n });\n }\n\n cambiarNuevo(campo: CampoFiltro, val: any) {\n if (campo.autocomplete) {\n const valControl = this.frmGroupSeleccionado.get(campo.campo + this.sufixTemporal)?.value;\n if (!valControl) {\n this.filtrados[campo.campo] = this.dataServidorSuscripcion[campo.autocomplete.data!]?.getValue() || [];\n } else {\n const config = campo.autocomplete;\n if (config.campotxtBuscar && val && val.length > (config.campotxtBuscarLength || 3)) {\n const reqQuery = config.data!;\n let reqData: any = {};\n\n if (campo.reqParams?.fields) {\n campo.reqParams.fields.forEach(f => {\n const ctrl = this.buscarControl(f);\n reqData[ctrl?.aliasCampoEnviar || f] = this.frmGroupSeleccionado.get(f)?.value;\n });\n }\n reqData[config.campotxtBuscar || campo.campo] = val;\n if (campo.reqParams?.params) Object.assign(reqData, campo.reqParams.params);\n\n this.inputParaEnviarAutocomplete.next({ reqQuery, reqData, controlData: campo });\n } else {\n this.accionPosteriorCambioAutocomplete(campo, valControl);\n }\n }\n }\n }\n\n cambiarSeleccionNuevo(campo: CampoFiltro, event?: any) {\n const val = event?.option?.value ?? event?.value ?? (event?.target ? event.target.value : event);\n if (val !== undefined) {\n this.actualizarEnFormArray(campo.campo, val);\n\n if (campo.autocomplete) {\n const config = campo.autocomplete;\n const list = this.dataServidorSuscripcion[config.data!]?.getValue() || [];\n const item = config.campoValor === '*objeto*' ? val : dataEnLista(list, config.campoValor || campo.campo, val);\n if (item) {\n const text = this.campoTextEval(campo, item);\n this.actualizarEnFormArray(campo.campo + this.sufixTemporal, text);\n }\n }\n\n const groupedMatch = this.dataOpcionesNuevo()[this.tabActual()].campos\n .filter(c => c.controlAgrupado)\n .find(c => c.controlAgrupado?.some(sub => sub.campo === campo.campo));\n if (groupedMatch) this.frmGroupSeleccionado.get(groupedMatch.campo)?.setValue(val);\n }\n\n if (campo.change?.filterFields) {\n campo.change.filterFields.forEach(target => {\n const targetMeta = this.buscarControl(target);\n if (targetMeta) {\n const params = this.generarParams(targetMeta, campo);\n this.actualizarEnFormArray(target, null);\n this.actualizarEnFormArray(target + this.sufixTemporal, null);\n this.dataServidorSuscripcion[target]?.next(null);\n\n const config = (targetMeta.select || targetMeta.autocomplete);\n if (config?.data) {\n this.queryService?.cargar(this, [config.data], params, false, this.prefijoConsulta()).then(d => {\n if (d) {\n const res = d[config.data!];\n this.actualizarEnFormArray(target, targetMeta.value || null);\n this.actualizarEnFormArray(target + this.sufixTemporal, targetMeta.value || null);\n if (!this.dataServidorSuscripcion[config.data!]) {\n this.dataServidorSuscripcion[config.data!] = new BehaviorSubject<any>(null);\n }\n this.dataServidorSuscripcion[config.data!].next(res);\n this.filtrados[target] = res;\n }\n });\n }\n }\n });\n } else if (campo.change?.filter) {\n setTimeout(() => this.filtrarData(), 1);\n }\n }\n\n buscarControl(campo: string): CampoFiltro | undefined {\n const rootCampos = this.dataOpcionesNuevo()[this.tabActual()].campos;\n let found = rootCampos.find(c => c.campo === campo);\n if (!found) {\n found = rootCampos.filter(c => c.controlAgrupado).flatMap(c => c.controlAgrupado!).find(c => c.campo === campo);\n }\n return found;\n }\n\n generarParams(meta: CampoFiltro, trigger: CampoFiltro): any {\n const params: any = {};\n if (meta.reqParams?.fields) {\n meta.reqParams.fields.forEach(f => {\n const ctrl = this.buscarControl(f);\n params[ctrl?.aliasCampoEnviar || f] = this.frmGroupSeleccionado.get(f)?.value;\n });\n } else {\n params[meta.aliasCampoEnviar || trigger.campo || meta.campo] = this.frmGroupSeleccionado.get(trigger.campo || meta.campo)?.value;\n }\n if (meta.reqParams?.params) Object.assign(params, meta.reqParams.params);\n return params;\n }\n\n limpiarAutocomplete(campo: CampoFiltro, event: Event) {\n this.actualizarEnFormArray(campo.campo, '');\n this.actualizarEnFormArray(campo.campo + this.sufixTemporal, '');\n this.cambiarSeleccionNuevo(campo, { option: { value: '' } });\n event.preventDefault();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (isCargaCompleta()) {\n <div class=\"filtroBusqueda w-full\">\n <div class=\"border-none p-0 flex flex-col\">\n\n @if (dataOpcionesNuevo().length === 1) {\n <div class=\"flex-1 flex items-end max-sm:flex-col flex-wrap gap-2\">\n <ng-container [ngTemplateOutlet]=\"verOpcionesT\"></ng-container>\n </div>\n } @else if (dataOpcionesNuevo().length > 1) {\n <div class=\"flex-1 flex flex-col flex-wrap gap-2 border\">\n <mat-tab-group\n [selectedIndex]=\"tabActual()\"\n (selectedIndexChange)=\"getControlRaiz('opcion').setValue($event)\"\n class=\"flex-1 flex flex-wrap\"\n [mat-stretch-tabs]=\"false\"\n dynamicHeight\n mat-align-tabs=\"start\"\n >\n @for (item of dataOpcionesNuevo(); track $index) {\n <mat-tab [aria-label]=\"(tabActual() === $index) ? 'primary' : ''\">\n <ng-template mat-tab-label>\n @if (tabActual() === $index) {\n <mat-icon class=\"icon-xs\" svgIcon=\"roundVerified\"></mat-icon>\n }\n &nbsp;{{ item.label }}\n </ng-template>\n\n <div class=\"mx-2 mt-0 pt-0 flex flex-col items-end sm:flex-row flex-wrap gap-2\">\n <ng-container [ngTemplateOutlet]=\"verOpcionesT\"></ng-container>\n </div>\n </mat-tab>\n }\n </mat-tab-group>\n </div>\n }\n </div>\n </div>\n}\n\n<ng-template #verOpcionesT>\n @for (campo of dataOpcionesNuevo()[tabActual()]?.campos; track campo.campo) {\n <ng-container [ngTemplateOutletContext]=\"{controlData: campo}\" [ngTemplateOutlet]=\"controlesFormularioNuevo\"></ng-container>\n }\n <ng-container [ngTemplateOutlet]=\"botonFiltrar\"></ng-container>\n</ng-template>\n\n<ng-template #botonFiltrar>\n <button (click)=\"filtrarData()\"\n class=\"flex items-center justify-center bg-primary text-primary-contrast font-bold uppercase text-xs px-2 py-1 rounded shadow-md hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150\"\n matRipple type=\"button\"\n [disabled]=\"!isCargaCompleta()\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundFilterAlt\"></mat-icon>&nbsp;\n <span>Filtrar</span>\n </button>\n</ng-template>\n\n<ng-template #controlesFormularioNuevo let-controlData=\"controlData\">\n @switch (controlData.control) {\n @case ('controlAgrupado') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputControlAgrupado, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('select') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputSelect, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('autocomplete') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputAutocomplete, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('date') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputDate, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('date_range') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputDateRange, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @case ('checkbox') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputCheckBox, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n @default {\n @if (controlData.control === 'text' || controlData.control === 'number') {\n <ng-container [ngTemplateOutletContext]=\"{template: inputTextNumber, controlData: controlData}\" [ngTemplateOutlet]=\"contenedorInput\"></ng-container>\n }\n }\n }\n</ng-template>\n\n<ng-template #contenedorInput let-template=\"template\" let-controlData=\"controlData\">\n <fieldset [class.flex-auto]=\"!controlData.cssClass\" [class]=\"controlData.cssClass\" class=\"appearance-none contenedorCampo relative\">\n <legend>\n <label [for]=\"controlData.campo\">{{ controlData.label }}@if(controlData.required){<span class=\"text-red-700 font-bold\"> *</span>}</label>\n </legend>\n <ng-container [ngTemplateOutletContext]=\"{controlData: controlData}\" [ngTemplateOutlet]=\"template\"></ng-container>\n </fieldset>\n</ng-template>\n\n<ng-template #inputSelect let-controlData=\"controlData\">\n <select [formControl]=\"getControl(controlData.campo)\"\n (change)=\"cambiarSeleccionNuevo(controlData, $event);\"\n [class]=\"controlData.select?.cssClass?.class\"\n [id]=\"controlData.campo\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n @if (controlData.select?.textoCuandoNulo) {\n <option value=\"\">{{ controlData.select?.textoCuandoNulo }}</option>\n }\n @for (itemSelect of dataServidorSuscripcion[controlData.select?.data!] | async; track $index) {\n <option [class]=\"controlData.select?.cssClass?.option\" [value]=\"campoValorEval(controlData, itemSelect)\">\n {{ campoTextEval(controlData, itemSelect) }}\n </option>\n }\n </select>\n</ng-template>\n\n<ng-template #inputControlAgrupado let-controlData=\"controlData\">\n <div class=\"flex items-center campos-container\">\n @for (sub of controlData.controlAgrupado; track sub.campo) {\n @switch (sub.control) {\n @case ('select') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputSelect\"></ng-container>\n }\n @case ('autocomplete') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputAutocomplete\"></ng-container>\n }\n @case ('date') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputDate\"></ng-container>\n }\n @case ('date_range') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputDateRange\"></ng-container>\n }\n @case ('checkbox') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputCheckBox\"></ng-container>\n }\n @default {\n @if (sub.control === 'text' || sub.control === 'number') {\n <ng-container [ngTemplateOutletContext]=\"{controlData: sub}\" [ngTemplateOutlet]=\"inputTextNumber\"></ng-container>\n }\n }\n }\n }\n </div>\n</ng-template>\n\n<ng-template #inputAutocomplete let-controlData=\"controlData\">\n <div class=\"flex items-center formcontrol-container\">\n <input [formControl]=\"getControl(controlData.campo + sufixTemporal)\"\n (input)=\"cambiarNuevo(controlData, $any($event.target).value)\"\n [matAutocomplete]=\"auto\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.autocomplete?.textoCuandoNulo ?? controlData.label }}\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"cambiarSeleccionNuevo(controlData, $event)\"\n [panelWidth]=\"'auto'\"\n [displayWith]=\"getAutocompleteLabel.bind(this, controlData)\"\n >\n @for (itemSelect of filtrados[controlData.campo]; track $index) {\n <mat-option [class]=\"controlData.autocomplete?.cssClass?.option\" [value]=\"campoValorEval(controlData, itemSelect)\">\n @if (controlData.autocomplete?.optionInnerHtml) {\n <div [innerHTML]=\"controlData.autocomplete?.optionInnerHtml!(itemSelect)\"></div>\n } @else {\n {{ campoTextEval(controlData, itemSelect) }}\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n <div class=\"flex items-center justify-start\">\n <button (click)=\"limpiarAutocomplete(controlData, $event)\" class=\"boton-circular-gris\"\n matRipple\n type=\"button\"\n >\n <mat-icon [svgIcon]=\"(getControl(controlData.campo).value ? 'roundCancel' : 'roundSearch')\" class=\"icon-2xs\"></mat-icon>\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #inputTextNumber let-controlData=\"controlData\">\n <input (keyup.enter)=\"controlData.keyUpEnter ? filtrarData() : null\"\n [formControl]=\"getControl(controlData.campo)\"\n [type]=\"controlData.control\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.label }}\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n</ng-template>\n\n<ng-template #inputDate let-controlData=\"controlData\">\n <div class=\"flex items-center date-container\">\n <input (keyup.enter)=\"controlData.keyUpEnter ? filtrarData() : null\"\n [formControl]=\"getControl(controlData.campo)\"\n (dateChange)=\"cambiarSeleccionNuevo(controlData, $event)\"\n [matDatepicker]=\"i\"\n autocomplete=\"off\"\n [id]=\"controlData.campo\"\n placeholder=\"{{ controlData.label }}\"\n type=\"text\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n >\n <mat-datepicker-toggle [for]=\"i\" class=\"icon-xs\" matSuffix></mat-datepicker-toggle>\n <mat-datepicker #i></mat-datepicker>\n </div>\n</ng-template>\n\n<ng-template #inputDateRange let-controlData=\"controlData\">\n <div class=\"flex items-center daterange-container\">\n <mat-date-range-input [rangePicker]=\"i\">\n <input [formControl]=\"getControl(controlData.dateRange?.campo![0])\" matStartDate placeholder=\"Desde\">\n <input [formControl]=\"getControl(controlData.dateRange?.campo![1])\" matEndDate placeholder=\"Hasta\">\n </mat-date-range-input>\n <mat-datepicker-toggle [for]=\"i\" class=\"icon-xs\"></mat-datepicker-toggle>\n <mat-date-range-picker #i></mat-date-range-picker>\n </div>\n</ng-template>\n\n<ng-template #inputCheckBox let-controlData=\"controlData\">\n <input [formControl]=\"getControl(controlData.campo)\"\n [id]=\"controlData.campo\"\n [required]=\"controlData.required\"\n [class.border-b-red-700]=\"getControl(controlData.campo).invalid\"\n type=\"checkbox\"\n (change)=\"cambiarSeleccionNuevo(controlData, $event)\"\n >\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -12,8 +12,7 @@ import * as i2 from '@angular/forms';
12
12
  import { FormsModule } from '@angular/forms';
13
13
  import { switchMap } from 'rxjs/operators';
14
14
  import { NestedTreeControl } from '@angular/cdk/tree';
15
- import { DataModel } from '@jvsoft/utils';
16
- import shortHash from 'shorthash2';
15
+ import { DataModel, simpleHash } from '@jvsoft/utils';
17
16
  import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
18
17
 
19
18
  function generarArbol(params) {
@@ -144,7 +143,7 @@ class ListaArbolComponent {
144
143
  if (data) {
145
144
  const idTablaVal = this._idTabla();
146
145
  if (idTablaVal.length < 1) {
147
- return shortHash(JSON.stringify({ data, claseFinal: undefined }));
146
+ return simpleHash(JSON.stringify({ data, claseFinal: undefined }));
148
147
  }
149
148
  return idTablaVal.map(d => data[d]).join('-');
150
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jvsoft-components-lista-arbol.mjs","sources":["../../../projects/components/lista-arbol/lista-arbol.functions.ts","../../../projects/components/lista-arbol/lista-arbol.component.ts","../../../projects/components/lista-arbol/lista-arbol.component.html","../../../projects/components/lista-arbol/jvsoft-components-lista-arbol.ts"],"sourcesContent":["export function generarArbol(params: {\n lista: any[],\n campoId: string,\n campoIdPadre: string,\n idPadre?: any,\n strChildren?: string,\n campoOrden?: string\n}): any[] {\n const {\n lista,\n campoId,\n campoIdPadre,\n idPadre = null,\n strChildren = 'hijos',\n campoOrden,\n } = params;\n\n const hijos = lista.filter(n => n[campoIdPadre] === idPadre);\n\n if (campoOrden) {\n hijos.sort((a, b) => {\n const va = a[campoOrden];\n const vb = b[campoOrden];\n\n if (typeof va === 'string' && typeof vb === 'string') {\n return va.localeCompare(vb);\n }\n if (typeof va === 'number' && typeof vb === 'number') {\n return va - vb;\n }\n return 0;\n });\n }\n\n return hijos.map(n => ({\n ...n,\n [strChildren]: generarArbol({\n lista,\n campoId,\n campoIdPadre,\n idPadre: n[campoId],\n strChildren,\n campoOrden,\n }),\n }));\n}\n","import {Component, TemplateRef, computed, effect, input, output, signal, inject, untracked} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatTreeModule} from '@angular/material/tree';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {FormsModule} from '@angular/forms';\nimport {Observable} from 'rxjs';\nimport {switchMap} from 'rxjs/operators';\nimport {NestedTreeControl} from '@angular/cdk/tree';\nimport {generarArbol} from './lista-arbol.functions';\nimport {DataModel} from '@jvsoft/utils';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport shortHash from 'shorthash2';\nimport {takeUntilDestroyed, toObservable} from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'jvs-lista-arbol',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTreeModule,\n MatIconModule,\n MatCheckboxModule,\n ],\n templateUrl: './lista-arbol.component.html',\n})\nexport class ListaArbolComponent<T = any> {\n // Inputs\n listaSuscription = input.required<Observable<T[]>>();\n nombreColeccion = input.required<string>();\n checkbox = input(false);\n expandirRecursivo = input(false);\n checkboxSeleccionados = input<T[]>([]);\n\n campoId = input.required<string>();\n campoIdPadre = input.required<string>();\n campoStr = input<string>(''); // Optional - can use templateTxtData instead\n campoOrden = input<string>();\n strHijoContainer = input('hijos');\n menuContextual = input<{ abrirMenuContextual: Function; cerrarMenuContextual: Function }>();\n classSeleccionado = input<string[]>(['bg-primary-activo', 'text-primary', 'dark:!bg-primary-dark-activo']);\n classAnulado = input<string[]>(['line-through', 'text-red', 'italic']);\n campoAnulado = input<string | null>();\n templateTxtData = input<TemplateRef<any>>();\n condicionMostrar = input<(item: T) => boolean>();\n condicionesClaseFila = input<(item: T) => string[]>(() => []);\n \n // idTabla input with transform to support both string and string[]\n idTabla = input.required<string[] | string, string[] | string>({\n transform: (val: string[] | string) => {\n if (Array.isArray(val)) {\n this._idTabla.set(val);\n return val;\n } else {\n this._idTabla.update(current => [...current, val]);\n return [val];\n }\n }\n });\n\n // selectionModel input for backward compatibility \n selectionModel = input<any>();\n\n // Outputs\n selectionModelChange = output<any>();\n seleccionado = output<any>();\n listaCheck = output<T[]>();\n listaCheckObj = output<Record<string, any>>();\n\n // Internal state as signals\n private _idTabla = signal<string[]>([]);\n private _seleccionado = signal<string | null>(null);\n listaMuestraArbol = signal<T[]>([]);\n listaOriginal = signal<T[]>([]);\n chkLista = new DataModel();\n\n // Computed values\n idTablaValue = computed(() => this._idTabla());\n\n buscarItemSeleccionado = computed(() => {\n const selId = this._seleccionado();\n const lista = this.listaOriginal();\n if (!selId) return null;\n return lista.find(itm => selId === this.propiedadSeleccion(itm)) ?? null;\n });\n\n objSeleccionado = computed(() => this.buscarItemSeleccionado());\n\n treeControl = new NestedTreeControl((node: any) => node[this.strHijoContainer()]);\n\n // Convert signal to observable for proper subscription management\n private listaSuscription$ = toObservable(this.listaSuscription);\n\n constructor() {\n // Watch selectionModel input for backward compatibility\n effect(() => {\n const selModel = this.selectionModel();\n if (selModel) {\n untracked(() => this.seleccionarItem(selModel, true));\n }\n });\n\n // Setup subscription with automatic cleanup using switchMap\n // switchMap automatically unsubscribes from previous observable when a new one arrives\n this.listaSuscription$\n .pipe(\n switchMap(obs => obs),\n takeUntilDestroyed()\n )\n .subscribe(res => {\n if (res) {\n this.listaOriginal.set(res);\n const listaAs = generarArbol({\n lista: res,\n campoId: this.campoId(),\n campoIdPadre: this.campoIdPadre(),\n idPadre: null,\n strChildren: this.strHijoContainer(),\n campoOrden: this.campoOrden(),\n });\n \n // Use untracked to avoid unnecessary re-renders\n untracked(() => {\n this.listaMuestraArbol.set(listaAs);\n });\n\n if (this.checkbox()) {\n this.chkLista.agregarControles(res, this.campoId());\n this.checkboxSeleccionados().forEach((chkSel: any) => {\n this.chkLista.setState(chkSel[this.campoId()], true);\n });\n this.emitirModeloCheck();\n }\n }\n });\n }\n\n idTablaValor(data: any): string {\n if (data) {\n const idTablaVal = this._idTabla();\n if (idTablaVal.length < 1) {\n return shortHash(JSON.stringify({data, claseFinal: undefined}));\n }\n return idTablaVal.map(d => data[d]).join('-');\n }\n return '';\n }\n\n propiedadSeleccion(item: any): string {\n return `${this.nombreColeccion()}_${this.idTablaValor(item)}`;\n }\n\n esSeleccionActual(item: any): boolean {\n return this._seleccionado() === this.propiedadSeleccion(item);\n }\n\n seleccionarItem(item?: any, forzado: boolean = false): void {\n const idItem = this.propiedadSeleccion(item);\n if (forzado) {\n this._seleccionado.set(idItem);\n } else {\n this._seleccionado.update(current => current === idItem ? null : idItem);\n }\n const objSel = this.objSeleccionado();\n this.selectionModelChange.emit(objSel);\n this.seleccionado.emit(objSel);\n }\n\n hasChild = (_: number, node: any) => {\n const strHijo = this.strHijoContainer();\n return !!node[strHijo] && node[strHijo].length > 0;\n };\n\n opcMenu(v: any) {\n const opAdic: any = {seccion: this.nombreColeccion()};\n opAdic['itemSeleccionado'] = this.objSeleccionado();\n }\n\n emitirModeloCheck() {\n this.listaCheck.emit(<any[]>this.chkLista.generarLista());\n this.listaCheckObj.emit(<object>this.chkLista.generarLista('object'));\n }\n\n cambiarPadre(checkActual: T, estado: boolean): void {\n const parentId = (checkActual as any)[this.campoIdPadre()];\n if (parentId) {\n // Fix: buscar en listaOriginal en lugar de listaMuestraArbol\n const listaOrig = this.listaOriginal();\n const padreAct = listaOrig.find((itm: any) => itm[this.campoId()] === parentId);\n if (padreAct) {\n this.chkLista.setState(parentId, this.hijosActivos('checked', padreAct) || this.hijosActivos('indeterminate', padreAct));\n this.cambiarPadre(padreAct, estado);\n }\n }\n }\n\n cambiarCheck(checkActual: T, estado: boolean): void {\n if (this.hasChild(0, checkActual)) {\n (this.treeControl.getChildren(checkActual) ?? []).forEach((vas: any) => {\n this.cambiarCheck(vas, estado);\n });\n }\n this.cambiarPadre(checkActual, estado);\n this.chkLista.setState((checkActual as any)[this.campoId()], estado);\n }\n\n hijosActivos(tipo: 'checked' | 'indeterminate', checkActual: T): boolean {\n let totalHijos = 0;\n let cantActivo = 0;\n if (this.hasChild(0, checkActual)) {\n (this.treeControl.getChildren(checkActual) ?? []).forEach((vas: any) => {\n if (this.chkLista.getState(vas[this.campoId()] + '')) {\n cantActivo++;\n }\n totalHijos++;\n });\n }\n\n switch (tipo) {\n case 'checked':\n return (cantActivo === totalHijos);\n case 'indeterminate':\n // Fix: remover efecto secundario\n return ((cantActivo > 0) && (cantActivo !== totalHijos));\n }\n return false;\n }\n\n classFila(item: any): string[] {\n let claseFinal: any[] = [];\n const campoAnul = this.campoAnulado();\n if (campoAnul && (item[campoAnul] === 1)) {\n claseFinal = claseFinal.concat(this.classAnulado());\n }\n const objSel = this.objSeleccionado();\n if (objSel === item || this.esSeleccionActual(item)) {\n claseFinal = claseFinal.concat(this.classSeleccionado());\n }\n const condClases = this.condicionesClaseFila();\n claseFinal = claseFinal.concat(condClases(item));\n // Fix: no mutar el objeto original\n return claseFinal;\n }\n}\n","<mat-tree [dataSource]=\"listaMuestraArbol()\" [treeControl]=\"treeControl\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle\n [matTreeNodeToggleRecursive]=\"expandirRecursivo()\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.hidden]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n\n <!-- Cambiar mat-tree-node plano por mat-nested-tree-node sin hijos -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node\">\n <div class=\"flex flex-col trans-ease-out\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual()?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion(), tipo: 'ver', item: node }); menuContextual()?.cerrarMenuContextual(); (nested === false) && $event.stopPropagation();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox()\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId()]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [indeterminate]=\"hasChild(0, node) && hijosActivos('indeterminate', node)\"\n [checked]=\"hasChild(0, node) ? hijosActivos('checked', node) : chkLista.modelosChk[node[campoId()]]\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData()\" class=\"w-full\">{{ node[campoStr()] }}</span>\n <ng-container *ngIf=\"templateTxtData()\" [ngTemplateOutlet]=\"templateTxtData()!\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jvsoft-components-lista-arbol.mjs","sources":["../../../projects/components/lista-arbol/lista-arbol.functions.ts","../../../projects/components/lista-arbol/lista-arbol.component.ts","../../../projects/components/lista-arbol/lista-arbol.component.html","../../../projects/components/lista-arbol/jvsoft-components-lista-arbol.ts"],"sourcesContent":["export function generarArbol(params: {\n lista: any[],\n campoId: string,\n campoIdPadre: string,\n idPadre?: any,\n strChildren?: string,\n campoOrden?: string\n}): any[] {\n const {\n lista,\n campoId,\n campoIdPadre,\n idPadre = null,\n strChildren = 'hijos',\n campoOrden,\n } = params;\n\n const hijos = lista.filter(n => n[campoIdPadre] === idPadre);\n\n if (campoOrden) {\n hijos.sort((a, b) => {\n const va = a[campoOrden];\n const vb = b[campoOrden];\n\n if (typeof va === 'string' && typeof vb === 'string') {\n return va.localeCompare(vb);\n }\n if (typeof va === 'number' && typeof vb === 'number') {\n return va - vb;\n }\n return 0;\n });\n }\n\n return hijos.map(n => ({\n ...n,\n [strChildren]: generarArbol({\n lista,\n campoId,\n campoIdPadre,\n idPadre: n[campoId],\n strChildren,\n campoOrden,\n }),\n }));\n}\n","import {Component, TemplateRef, computed, effect, input, output, signal, inject, untracked} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatTreeModule} from '@angular/material/tree';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {FormsModule} from '@angular/forms';\nimport {Observable} from 'rxjs';\nimport {switchMap} from 'rxjs/operators';\nimport {NestedTreeControl} from '@angular/cdk/tree';\nimport {generarArbol} from './lista-arbol.functions';\nimport {DataModel} from '@jvsoft/utils';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport { simpleHash } from '@jvsoft/utils';\nimport {takeUntilDestroyed, toObservable} from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'jvs-lista-arbol',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTreeModule,\n MatIconModule,\n MatCheckboxModule,\n ],\n templateUrl: './lista-arbol.component.html',\n})\nexport class ListaArbolComponent<T = any> {\n // Inputs\n listaSuscription = input.required<Observable<T[]>>();\n nombreColeccion = input.required<string>();\n checkbox = input(false);\n expandirRecursivo = input(false);\n checkboxSeleccionados = input<T[]>([]);\n\n campoId = input.required<string>();\n campoIdPadre = input.required<string>();\n campoStr = input<string>(''); // Optional - can use templateTxtData instead\n campoOrden = input<string>();\n strHijoContainer = input('hijos');\n menuContextual = input<{ abrirMenuContextual: Function; cerrarMenuContextual: Function }>();\n classSeleccionado = input<string[]>(['bg-primary-activo', 'text-primary', 'dark:!bg-primary-dark-activo']);\n classAnulado = input<string[]>(['line-through', 'text-red', 'italic']);\n campoAnulado = input<string | null>();\n templateTxtData = input<TemplateRef<any>>();\n condicionMostrar = input<(item: T) => boolean>();\n condicionesClaseFila = input<(item: T) => string[]>(() => []);\n \n // idTabla input with transform to support both string and string[]\n idTabla = input.required<string[] | string, string[] | string>({\n transform: (val: string[] | string) => {\n if (Array.isArray(val)) {\n this._idTabla.set(val);\n return val;\n } else {\n this._idTabla.update(current => [...current, val]);\n return [val];\n }\n }\n });\n\n // selectionModel input for backward compatibility \n selectionModel = input<any>();\n\n // Outputs\n selectionModelChange = output<any>();\n seleccionado = output<any>();\n listaCheck = output<T[]>();\n listaCheckObj = output<Record<string, any>>();\n\n // Internal state as signals\n private _idTabla = signal<string[]>([]);\n private _seleccionado = signal<string | null>(null);\n listaMuestraArbol = signal<T[]>([]);\n listaOriginal = signal<T[]>([]);\n chkLista = new DataModel();\n\n // Computed values\n idTablaValue = computed(() => this._idTabla());\n\n buscarItemSeleccionado = computed(() => {\n const selId = this._seleccionado();\n const lista = this.listaOriginal();\n if (!selId) return null;\n return lista.find(itm => selId === this.propiedadSeleccion(itm)) ?? null;\n });\n\n objSeleccionado = computed(() => this.buscarItemSeleccionado());\n\n treeControl = new NestedTreeControl((node: any) => node[this.strHijoContainer()]);\n\n // Convert signal to observable for proper subscription management\n private listaSuscription$ = toObservable(this.listaSuscription);\n\n constructor() {\n // Watch selectionModel input for backward compatibility\n effect(() => {\n const selModel = this.selectionModel();\n if (selModel) {\n untracked(() => this.seleccionarItem(selModel, true));\n }\n });\n\n // Setup subscription with automatic cleanup using switchMap\n // switchMap automatically unsubscribes from previous observable when a new one arrives\n this.listaSuscription$\n .pipe(\n switchMap(obs => obs),\n takeUntilDestroyed()\n )\n .subscribe(res => {\n if (res) {\n this.listaOriginal.set(res);\n const listaAs = generarArbol({\n lista: res,\n campoId: this.campoId(),\n campoIdPadre: this.campoIdPadre(),\n idPadre: null,\n strChildren: this.strHijoContainer(),\n campoOrden: this.campoOrden(),\n });\n \n // Use untracked to avoid unnecessary re-renders\n untracked(() => {\n this.listaMuestraArbol.set(listaAs);\n });\n\n if (this.checkbox()) {\n this.chkLista.agregarControles(res, this.campoId());\n this.checkboxSeleccionados().forEach((chkSel: any) => {\n this.chkLista.setState(chkSel[this.campoId()], true);\n });\n this.emitirModeloCheck();\n }\n }\n });\n }\n\n idTablaValor(data: any): string {\n if (data) {\n const idTablaVal = this._idTabla();\n if (idTablaVal.length < 1) {\n return simpleHash(JSON.stringify({data, claseFinal: undefined}));\n }\n return idTablaVal.map(d => data[d]).join('-');\n }\n return '';\n }\n\n propiedadSeleccion(item: any): string {\n return `${this.nombreColeccion()}_${this.idTablaValor(item)}`;\n }\n\n esSeleccionActual(item: any): boolean {\n return this._seleccionado() === this.propiedadSeleccion(item);\n }\n\n seleccionarItem(item?: any, forzado: boolean = false): void {\n const idItem = this.propiedadSeleccion(item);\n if (forzado) {\n this._seleccionado.set(idItem);\n } else {\n this._seleccionado.update(current => current === idItem ? null : idItem);\n }\n const objSel = this.objSeleccionado();\n this.selectionModelChange.emit(objSel);\n this.seleccionado.emit(objSel);\n }\n\n hasChild = (_: number, node: any) => {\n const strHijo = this.strHijoContainer();\n return !!node[strHijo] && node[strHijo].length > 0;\n };\n\n opcMenu(v: any) {\n const opAdic: any = {seccion: this.nombreColeccion()};\n opAdic['itemSeleccionado'] = this.objSeleccionado();\n }\n\n emitirModeloCheck() {\n this.listaCheck.emit(<any[]>this.chkLista.generarLista());\n this.listaCheckObj.emit(<object>this.chkLista.generarLista('object'));\n }\n\n cambiarPadre(checkActual: T, estado: boolean): void {\n const parentId = (checkActual as any)[this.campoIdPadre()];\n if (parentId) {\n // Fix: buscar en listaOriginal en lugar de listaMuestraArbol\n const listaOrig = this.listaOriginal();\n const padreAct = listaOrig.find((itm: any) => itm[this.campoId()] === parentId);\n if (padreAct) {\n this.chkLista.setState(parentId, this.hijosActivos('checked', padreAct) || this.hijosActivos('indeterminate', padreAct));\n this.cambiarPadre(padreAct, estado);\n }\n }\n }\n\n cambiarCheck(checkActual: T, estado: boolean): void {\n if (this.hasChild(0, checkActual)) {\n (this.treeControl.getChildren(checkActual) ?? []).forEach((vas: any) => {\n this.cambiarCheck(vas, estado);\n });\n }\n this.cambiarPadre(checkActual, estado);\n this.chkLista.setState((checkActual as any)[this.campoId()], estado);\n }\n\n hijosActivos(tipo: 'checked' | 'indeterminate', checkActual: T): boolean {\n let totalHijos = 0;\n let cantActivo = 0;\n if (this.hasChild(0, checkActual)) {\n (this.treeControl.getChildren(checkActual) ?? []).forEach((vas: any) => {\n if (this.chkLista.getState(vas[this.campoId()] + '')) {\n cantActivo++;\n }\n totalHijos++;\n });\n }\n\n switch (tipo) {\n case 'checked':\n return (cantActivo === totalHijos);\n case 'indeterminate':\n // Fix: remover efecto secundario\n return ((cantActivo > 0) && (cantActivo !== totalHijos));\n }\n return false;\n }\n\n classFila(item: any): string[] {\n let claseFinal: any[] = [];\n const campoAnul = this.campoAnulado();\n if (campoAnul && (item[campoAnul] === 1)) {\n claseFinal = claseFinal.concat(this.classAnulado());\n }\n const objSel = this.objSeleccionado();\n if (objSel === item || this.esSeleccionActual(item)) {\n claseFinal = claseFinal.concat(this.classSeleccionado());\n }\n const condClases = this.condicionesClaseFila();\n claseFinal = claseFinal.concat(condClases(item));\n // Fix: no mutar el objeto original\n return claseFinal;\n }\n}\n","<mat-tree [dataSource]=\"listaMuestraArbol()\" [treeControl]=\"treeControl\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle\n [matTreeNodeToggleRecursive]=\"expandirRecursivo()\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.hidden]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n\n <!-- Cambiar mat-tree-node plano por mat-nested-tree-node sin hijos -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node\">\n <div class=\"flex flex-col trans-ease-out\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual()?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion(), tipo: 'ver', item: node }); menuContextual()?.cerrarMenuContextual(); (nested === false) && $event.stopPropagation();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox()\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId()]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [indeterminate]=\"hasChild(0, node) && hijosActivos('indeterminate', node)\"\n [checked]=\"hasChild(0, node) ? hijosActivos('checked', node) : chkLista.modelosChk[node[campoId()]]\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData()\" class=\"w-full\">{{ node[campoStr()] }}</span>\n <ng-container *ngIf=\"templateTxtData()\" [ngTemplateOutlet]=\"templateTxtData()!\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}