@guajiritos/general-autocomplete 19.0.18 → 19.0.20

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.
@@ -20,7 +20,7 @@ import * as i9 from '@angular/material/progress-spinner';
20
20
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
21
21
  import * as i2 from '@ngx-translate/core';
22
22
  import { TranslateModule } from '@ngx-translate/core';
23
- import { Subject, debounceTime, tap, switchMap, of, from, finalize } from 'rxjs';
23
+ import { Subject, debounceTime, tap, switchMap, of, catchError, from, finalize } from 'rxjs';
24
24
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
25
25
 
26
26
  const GENERAL_DISPLAY_OPTIONS = {
@@ -98,6 +98,7 @@ class GuajiritosGeneralAutocomplete {
98
98
  // --- Propiedades Privadas ---
99
99
  this._isOptionSelected = false; // Indica si la última actualización del input fue por una selección explícita desde el autocompletado
100
100
  this._onFocusTriggeredSearch = false;
101
+ this._userInteracted = false;
101
102
  this._clearDataSubject = new Subject();
102
103
  this._doFocusSubject = new Subject();
103
104
  this._selectedElement = null; // Almacena el objeto completo seleccionado
@@ -222,15 +223,16 @@ class GuajiritosGeneralAutocomplete {
222
223
  * Añade o elimina restricciones de búsqueda
223
224
  */
224
225
  set restrictions(restrictions) {
226
+ // Using stringify for simple object comparison. If restrictions become complex, a more robust method is needed.
227
+ if (JSON.stringify(this._restrictionsFilters) === JSON.stringify(restrictions)) {
228
+ return;
229
+ }
225
230
  this._restrictionsFilters = restrictions?.length ? [...restrictions] : [];
226
- // Siempre resetear el estado cuando cambian las restricciones
227
231
  this.resetAutocompleteState();
228
- // Re-ejecutar búsqueda si el input tiene texto o si está vacío y no hay selección, o si las restricciones cambiaron realmente el resultado esperado.
229
232
  const currentSearchText = this.getAutocompleteSearchText();
230
- // Sólo si ya había un texto o una selección, o si las restricciones realmente impactan la búsqueda inicial.
231
- if (currentSearchText !== this._lastSearchText ||
232
- (!currentSearchText && !this._selectedElement) ||
233
- restrictions?.length > 0) {
233
+ // Only re-trigger a search if there was already text in the input.
234
+ // If the input was empty, we'll wait for user interaction (opening the panel).
235
+ if (currentSearchText) {
234
236
  // No actualizar _lastSearchText aquí, se actualiza después de la API.
235
237
  this.getAutocompleteByTextHandler(currentSearchText);
236
238
  }
@@ -259,6 +261,12 @@ class GuajiritosGeneralAutocomplete {
259
261
  takeUntilDestroyed(this._destroyRef))
260
262
  .subscribe({
261
263
  next: () => {
264
+ // SOLO ejecutar si el usuario ya ha interactu-ado con el componente.
265
+ // Esto previene que un focus programático inicial (ej: al renderizar una tabla)
266
+ // dispare una búsqueda no deseada.
267
+ if (!this._userInteracted) {
268
+ return;
269
+ }
262
270
  this._zone.run(() => {
263
271
  setTimeout(() => {
264
272
  this.inputText?.nativeElement?.focus();
@@ -330,7 +338,12 @@ class GuajiritosGeneralAutocomplete {
330
338
  if (currentSearchText !== this._lastSearchText) {
331
339
  this.resetAutocompleteState();
332
340
  this._lastSearchText = currentSearchText;
333
- return this.getAutocompleteByTextHandler(currentSearchText, true);
341
+ const source$ = this.getAutocompleteByTextHandler(currentSearchText, true);
342
+ return source$.pipe(catchError(() => {
343
+ // Al atrapar el error aquí, evitamos que la cadena principal de valueChanges se rompa.
344
+ // Devolvemos un observable vacío para que la suscripción continúe escuchando cambios.
345
+ return of(null);
346
+ }));
334
347
  }
335
348
  else {
336
349
  // Si el texto es el mismo, pero el panel está abierto, sin opciones y hay más datos potenciales,
@@ -498,7 +511,7 @@ class GuajiritosGeneralAutocomplete {
498
511
  */
499
512
  getAutocompleteByTextHandler(text, returnObservable = false) {
500
513
  const currentSearchText = text ?? "";
501
- if (this.loading()) {
514
+ if (this.loading() || !this._userInteracted) {
502
515
  return returnObservable ? of(null) : undefined;
503
516
  }
504
517
  if (!this.hasMore() &&
@@ -660,6 +673,9 @@ class GuajiritosGeneralAutocomplete {
660
673
  * Acción al enfocar el elemento
661
674
  */
662
675
  onFocus() {
676
+ if (!this._userInteracted) {
677
+ return;
678
+ }
663
679
  // Si el panel ya está abierto, no hacer nada para evitar bucles o recargas innecesarias al volver a hacer clic.
664
680
  if (this.autocompleteTrigger?.panelOpen) {
665
681
  return;
@@ -673,6 +689,20 @@ class GuajiritosGeneralAutocomplete {
673
689
  this.getAutocompleteByTextHandler(searchText);
674
690
  }
675
691
  }
692
+ onUserInteraction() {
693
+ this._userInteracted = true;
694
+ if (this.autocompleteTrigger?.panelOpen) {
695
+ return;
696
+ }
697
+ this.resetAutocompleteState();
698
+ if (!this._selectedElement) {
699
+ this._onFocusTriggeredSearch = true;
700
+ const searchText = this.getAutocompleteSearchText() ?? "";
701
+ // Forzar una búsqueda. El evento `opened` también se disparará,
702
+ // pero el flag `_onFocusTriggeredSearch` debería prevenir una doble petición.
703
+ this.getAutocompleteByTextHandler(searchText);
704
+ }
705
+ }
676
706
  optionSelected($event) {
677
707
  const selectedValue = $event?.option?.value;
678
708
  if (selectedValue) {
@@ -716,7 +746,7 @@ class GuajiritosGeneralAutocomplete {
716
746
  useExisting: forwardRef(() => GuajiritosGeneralAutocomplete),
717
747
  multi: true,
718
748
  },
719
- ], viewQueries: [{ propertyName: "inputText", first: true, predicate: ["inputText"], descendants: true, static: true }, { propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n", styles: [".w-100{width:100%}.display-options{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "pipe", type: ResolvePropertyPath, name: "resolvePropertyPath" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
749
+ ], viewQueries: [{ propertyName: "inputText", first: true, predicate: ["inputText"], descendants: true, static: true }, { propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n (click)=\"onUserInteraction()\"\n (keydown)=\"onUserInteraction()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n", styles: [".w-100{width:100%}.display-options{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "pipe", type: ResolvePropertyPath, name: "resolvePropertyPath" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
720
750
  }
721
751
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: GuajiritosGeneralAutocomplete, decorators: [{
722
752
  type: Component,
@@ -738,7 +768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
738
768
  useExisting: forwardRef(() => GuajiritosGeneralAutocomplete),
739
769
  multi: true,
740
770
  },
741
- ], template: "<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n", styles: [".w-100{width:100%}.display-options{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}\n"] }]
771
+ ], template: "<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n (click)=\"onUserInteraction()\"\n (keydown)=\"onUserInteraction()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n", styles: [".w-100{width:100%}.display-options{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}\n"] }]
742
772
  }], ctorParameters: () => [{ type: i1.AutocompleteService }, { type: i0.NgZone }, { type: i0.DestroyRef }, { type: i2.TranslateService }], propDecorators: { inputText: [{
743
773
  type: ViewChild,
744
774
  args: ["inputText", { static: true }]
@@ -1 +1 @@
1
- {"version":3,"file":"guajiritos-general-autocomplete.mjs","sources":["../../../projects/guachos-general-autocomplete/src/utils/constants/constants.ts","../../../projects/guachos-general-autocomplete/src/utils/services/utils.service.ts","../../../projects/guachos-general-autocomplete/src/utils/pipes/resolve-property-path.pipe.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.html","../../../projects/guachos-general-autocomplete/src/public-api.ts","../../../projects/guachos-general-autocomplete/src/guajiritos-general-autocomplete.ts"],"sourcesContent":["import { DisplayOption, DisplayOptionItemType } from '@guajiritos/services';\nimport {DisplayOptionItem} from \"@guajiritos/services/lib/interfaces/interfaces\";\n\n\nexport const GENERAL_DISPLAY_OPTIONS: DisplayOption = {\n firthLabel: [\n {\n type: DisplayOptionItemType.PATH,\n path: ['name']\n }\n ],\n applyTranslate: true\n};\n\nexport interface ServiceConfig {\n service: any;\n method: string;\n postBody: any;\n searchProperty: string;\n [key: string]: any;\n}\n","import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UtilsService {\n /**\n * Resolves the value of a property in an object by providing a path.\n *\n * @param {any} obj - The object to traverse.\n * @param {string[]} path - An array of strings representing the path to the desired property.\n * @return {any} The value of the property at the given path, or null if the path is invalid.\n */\n public static resolvePropertyByPath(obj: any, path: string[]): any {\n return path.reduce((prev, curr: string) => {\n return prev ? prev[curr] : null;\n }, obj || self);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { DisplayOptionItem, DisplayOptionItemType } from '@guajiritos/services';\n\nimport { UtilsService } from '../services/utils.service';\n\n@Pipe({\n name: 'resolvePropertyPath',\n standalone: true\n})\nexport class ResolvePropertyPath implements PipeTransform {\n /**\n * Transforms the given object based on the provided path and returns the transformed string.\n *\n * @param {any} obj - The object to be transformed.\n * @param {DisplayOptionItem[]} path - The array of display option items used for transformation.\n * @return {string} The transformed string.\n */\n transform(obj: any, path: DisplayOptionItem[]): string {\n let result: string = '';\n\n path?.forEach((item: DisplayOptionItem): void => {\n if (item?.type === DisplayOptionItemType.DIVIDER) {\n result += item?.divider;\n } else {\n if (item?.path) {\n result += UtilsService.resolvePropertyByPath(obj, item.path);\n }\n }\n });\n\n return result;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n NgZone,\n Output,\n signal,\n TemplateRef,\n ViewChild,\n WritableSignal,\n} from \"@angular/core\";\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n UntypedFormControl,\n ValidationErrors,\n ValidatorFn,\n Validators,\n} from \"@angular/forms\";\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n MatAutocompleteTrigger,\n} from \"@angular/material/autocomplete\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { ThemePalette } from \"@angular/material/core\";\nimport {\n FloatLabelType,\n MatFormFieldAppearance,\n MatFormFieldModule,\n SubscriptSizing,\n} from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\nimport { TranslateModule, TranslateService } from \"@ngx-translate/core\";\nimport {\n debounceTime,\n finalize,\n Observable,\n Subject,\n from,\n switchMap,\n tap, of,\n} from \"rxjs\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\n\nimport {\n ApiFormData,\n AutocompleteService,\n DisplayOption,\n DisplayOptionItemType,\n I18nPipe,\n RestrictionFilter,\n} from \"@guajiritos/services\";\n\nimport {\n GENERAL_DISPLAY_OPTIONS,\n ServiceConfig,\n} from \"../utils/constants/constants\";\nimport { ResolvePropertyPath } from \"../utils/pipes/resolve-property-path.pipe\";\nimport { UtilsService } from \"../utils/services/utils.service\";\n\n@Component({\n selector: \"guajiritos-general-autocomplete\",\n templateUrl: \"./guachos-general-autocomplete.component.html\",\n styleUrls: [\"./guachos-general-autocomplete.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatFormFieldModule,\n TranslateModule,\n MatIconModule,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n MatProgressSpinnerModule,\n MatAutocompleteModule,\n I18nPipe,\n ResolvePropertyPath,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => GuajiritosGeneralAutocomplete),\n multi: true,\n },\n ],\n})\nexport class GuajiritosGeneralAutocomplete\n implements ControlValueAccessor, AfterViewInit\n{\n constructor(\n private _autocompleteService: AutocompleteService,\n private _zone: NgZone,\n private _destroyRef: DestroyRef,\n public translateService: TranslateService,\n ) {}\n\n // --- Propiedades Privadas ---\n private _isOptionSelected: boolean = false; // Indica si la última actualización del input fue por una selección explícita desde el autocompletado\n private _onFocusTriggeredSearch = false;\n private _clearDataSubject: Subject<void> = new Subject<void>();\n private _doFocusSubject: Subject<void> = new Subject<void>();\n private _selectedElement: any = null; // Almacena el objeto completo seleccionado\n private _url: string | null = null;\n private _serviceConfig: ServiceConfig = null;\n private _limit: number = 20;\n private _offset: number = 0;\n private _restrictionsFilters: RestrictionFilter[] = [];\n private _lastSearchText: string = \"\"; // Almacena el texto usado en la última búsqueda de API exitosa\n\n // --- Señales Públicas (Signals) ---\n public disabled: WritableSignal<boolean> = signal(false);\n public loading: WritableSignal<boolean> = signal(false);\n public required: WritableSignal<boolean> = signal(false);\n public filteredOptions: WritableSignal<any[]> = signal([]);\n public originalOptions: WritableSignal<any[]> = signal([]);\n public notAllowedOption: WritableSignal<any> = signal(null);\n public component: UntypedFormControl = new UntypedFormControl({\n value: null,\n disabled: false,\n });\n public hasMore: WritableSignal<boolean> = signal(true); // Indica si hay más datos para cargar\n\n // --- ViewChildren ---\n @ViewChild(\"inputText\", { static: true }) inputText!: ElementRef;\n @ViewChild(\"auto\") matAutocomplete!: MatAutocomplete;\n @ViewChild(MatAutocompleteTrigger)\n autocompleteTrigger!: MatAutocompleteTrigger;\n\n // --- Inputs ---\n @Input() floatLabel: FloatLabelType = \"auto\";\n @Input() color: ThemePalette = \"accent\";\n @Input() appearance: MatFormFieldAppearance = \"outline\";\n @Input() subscriptSizing: SubscriptSizing = \"dynamic\";\n @Input() bodyRequest?: ApiFormData;\n @Input() debounceTimeValue: number = 300;\n @Input() detailsTemplate?: TemplateRef<any>;\n @Input() label: string = \"Seleccione\";\n @Input() showLabel: boolean = true;\n @Input() placeholder: string = \"Seleccione un elemento\";\n @Input() field: string[] = [\"name\"];\n @Input() filterString: string[] | string = \"filter[$and][name][$like]\";\n @Input() displayOptions: DisplayOption = GENERAL_DISPLAY_OPTIONS;\n @Input() withoutPaddingBottom: boolean = true;\n @Input() valueId: boolean = false;\n @Input() showSuffix: boolean = false;\n @Input() requireSelection: boolean = false;\n @Input() order?: string;\n @Input() suffixIcon: string = \"search\";\n @Input() removeProperties: string[] = [];\n @Input() modifyResultFn: (options: any[]) => any[] = (options: any[]) =>\n options;\n\n // --- Outputs ---\n @Output() SelectElement: EventEmitter<any> = new EventEmitter<any>();\n @Output() clearElement: EventEmitter<any> = new EventEmitter<any>();\n\n // --- Setters para Inputs ---\n @Input() set url(data: string) {\n if (data) {\n this._url = data;\n // Suscribirse a los cambios del componente una vez que la URL está disponible\n this.subscribeToComponentChanges();\n }\n }\n\n // --- Setters para Inputs ---\n @Input() set serviceConfig(data: ServiceConfig) {\n if (data) {\n console.log(data);\n this._serviceConfig = data;\n // Suscribirse a los cambios del componente una vez que la URL está disponible\n this.subscribeToComponentChanges();\n }\n }\n\n @Input() set limit(value: number) {\n if (value && !isNaN(value)) {\n this._limit = value;\n }\n }\n\n @Input() set clearData(value: Subject<void>) {\n this._clearDataSubject = value;\n this._clearDataSubject\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe({\n next: (): void => {\n this.clearInternalState();\n },\n });\n }\n\n @Input() set initialValue(value: any) {\n // Si el valor inicial es el mismo que el valor actual del control, no hacer nada para evitar bucles\n if (value === this.component.value) {\n return;\n }\n\n this._selectedElement = value;\n this._isOptionSelected = !!value; // Marcar como seleccionado si hay un valor inicial\n\n // Establecer el valor en el formControl sin emitir el evento\n // para evitar que subscribeToComponentChanges reaccione a esta carga inicial.\n this.component.setValue(value, { emitEvent: false });\n\n // Actualizar _lastSearchText basado en el valor inicial\n if (value) {\n this._lastSearchText = this.displayFn(value);\n } else {\n this._lastSearchText = \"\";\n }\n }\n\n /**\n * Añade o elimina restricciones de búsqueda\n */\n @Input() set restrictions(restrictions: RestrictionFilter[]) {\n this._restrictionsFilters = restrictions?.length ? [...restrictions] : [];\n // Siempre resetear el estado cuando cambian las restricciones\n this.resetAutocompleteState();\n // Re-ejecutar búsqueda si el input tiene texto o si está vacío y no hay selección, o si las restricciones cambiaron realmente el resultado esperado.\n const currentSearchText = this.getAutocompleteSearchText();\n // Sólo si ya había un texto o una selección, o si las restricciones realmente impactan la búsqueda inicial.\n if (\n currentSearchText !== this._lastSearchText ||\n (!currentSearchText && !this._selectedElement) ||\n restrictions?.length > 0\n ) {\n // No actualizar _lastSearchText aquí, se actualiza después de la API.\n this.getAutocompleteByTextHandler(currentSearchText);\n }\n }\n\n /**\n * Añade o elimina la validación de requerido\n */\n @Input() set isRequired(required: boolean) {\n this.required.set(required);\n const validators: ValidatorFn[] = [autocompleteValidator];\n if (required) {\n validators.push(Validators.required);\n }\n this.component.setValidators(validators);\n this.component.updateValueAndValidity();\n this.component.markAsDirty();\n this.component.markAsTouched();\n }\n\n /**\n * Define si se realiza una búsqueda cuando el elemento está en foco\n */\n @Input() set doFocus(focusSubject: Subject<void>) {\n this._doFocusSubject = focusSubject;\n this._doFocusSubject\n .pipe(\n debounceTime(this.debounceTimeValue), // Retrasar para evitar llamadas excesivas\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (): void => {\n this._zone.run((): void => {\n setTimeout((): void => {\n this.inputText?.nativeElement?.focus();\n // Simular evento 'input' para disparar valueChanges, pero solo si el input está vacío\n // o si ya hay un valor pero no es el seleccionado (usuario queriendo buscar de nuevo).\n if (\n !this.component.value ||\n (typeof this.component.value === \"string\" &&\n !this._selectedElement)\n ) {\n (\n this.inputText?.nativeElement as HTMLInputElement\n )?.dispatchEvent(new Event(\"input\"));\n }\n this.autocompleteTrigger?.openPanel();\n }, 50); // Un pequeño retraso para asegurar el foco y la apertura\n });\n },\n });\n }\n\n @Input() set notAllowedElements(element: any) {\n if (element) {\n this.notAllowedOption.set(element);\n this.filterOptionsBasedOnNotAllowed();\n }\n }\n\n /**\n * Reinicia el estado de paginación y opciones del autocompletado.\n * Centraliza la lógica para evitar duplicación.\n */\n private resetAutocompleteState(): void {\n this._offset = 0;\n this.originalOptions.set([]);\n this.filteredOptions.set([]);\n this.hasMore.set(true);\n }\n\n /**\n * Suscripción a los cambios del input de búsqueda\n */\n private subscribeToComponentChanges(): void {\n this.component.valueChanges\n .pipe(\n // TAP se ejecuta inmediatamente ANTES del debounce.\n // Esto es crucial para detectar borrados de texto en tiempo real y desvincular _selectedElement.\n tap((value) => {\n const currentInputText = this.getAutocompleteSearchText();\n\n // Si el valor actual del control es un STRING (usuario escribiendo/borrando)\n // Y previamente había un objeto seleccionado (_selectedElement)\n // Y el texto en el input ya no coincide con el displayFn del _selectedElement,\n // entonces desvinculamos el _selectedElement y marcamos que no hay selección.\n if (\n typeof value === \"string\" &&\n this._selectedElement &&\n currentInputText !== this.displayFn(this._selectedElement)\n ) {\n this._selectedElement = null; // Quitar la referencia al objeto seleccionado\n this._isOptionSelected = false; // Marcar que no hay una opción seleccionada\n } else if (typeof value === \"string\") {\n // Si el valor es un string, simplemente marcamos que no hay opción seleccionada.\n // Esto cubre los casos donde el usuario escribe por primera vez o borra sin haber seleccionado.\n this._isOptionSelected = false;\n }\n }),\n debounceTime(this.debounceTimeValue), // El debounce se aplica después de la lógica del tap\n switchMap((value: any) => {\n const currentSearchText = this.getAutocompleteSearchText();\n\n // Caso 1: El valor es un objeto y coincide con el elemento seleccionado.\n if (\n typeof value === \"object\" &&\n value !== null &&\n this._selectedElement === value\n ) {\n this._lastSearchText = this.displayFn(value);\n return of(null);\n }\n\n // Caso 2: El usuario ha terminado de escribir o borrar texto.\n if (currentSearchText !== this._lastSearchText) {\n this.resetAutocompleteState();\n this._lastSearchText = currentSearchText;\n return this.getAutocompleteByTextHandler(\n currentSearchText,\n true,\n ) as Observable<any>;\n } else {\n // Si el texto es el mismo, pero el panel está abierto, sin opciones y hay más datos potenciales,\n // podemos necesitar una recarga.\n if (\n this.matAutocomplete._isOpen &&\n this.originalOptions().length === 0 &&\n this.hasMore() &&\n !this.loading()\n ) {\n return this.getAutocompleteByTextHandler(\n currentSearchText,\n true,\n ) as Observable<any>;\n }\n }\n return of(null);\n }),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (result: any): void => {\n if (!result) {\n return;\n }\n\n const newData = result?.payload?.data ?? result?.data ?? [];\n\n if (this._offset === 0) {\n this.originalOptions.set(newData);\n } else {\n this.originalOptions.update((currentOptions) => [\n ...currentOptions,\n ...newData,\n ]);\n }\n\n this._offset += newData.length;\n\n if (newData.length < this._limit) {\n this.hasMore.set(false);\n } else {\n this.hasMore.set(true);\n }\n\n this.filterOptionsBasedOnNotAllowed();\n },\n error: (error) => {\n this.loading.set(false);\n },\n });\n }\n\n ngAfterViewInit(): void {\n // Suscribirse a la apertura del panel para añadir el listener de scroll y cargar datos\n this.matAutocomplete.opened\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n if (this._onFocusTriggeredSearch) {\n this._onFocusTriggeredSearch = false;\n return;\n }\n\n if (this.matAutocomplete?.panel) {\n // Asegurarse de que el listener sea removido antes de añadirlo para prevenir duplicados\n this.matAutocomplete.panel.nativeElement.removeEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n this.matAutocomplete.panel.nativeElement.addEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n\n const currentSearchText = this.getAutocompleteSearchText();\n\n // **********************************************\n // MODIFICACIÓN CLAVE AQUÍ:\n // Cargar opciones iniciales SOLO SI:\n // 1. No hay opciones cargadas (primera apertura o después de un clear/reset).\n // 2. O el texto actual en el input es diferente del _lastSearchText (el usuario escribió algo nuevo o borró y abrió).\n // 3. O el input está vacío Y no hay un _selectedElement Y hay más datos por cargar Y el offset es 0 (lo que implica que es la primera carga para este estado vacío).\n // Esto evita la doble llamada si subscribeToComponentChanges ya disparó una búsqueda\n // para el mismo texto, o si ya se sabe que no hay más datos para un input vacío.\n // **********************************************\n if (\n this.originalOptions().length === 0 || // No hay opciones, cargar siempre.\n currentSearchText !== this._lastSearchText || // El texto ha cambiado, nueva búsqueda.\n (currentSearchText === \"\" &&\n !this._selectedElement &&\n this.hasMore() &&\n this._offset === 0) // Input vacío, sin selección, con potencial de datos, y es la primera carga.\n ) {\n this.resetAutocompleteState(); // Asegurarse de resetear antes de una nueva carga\n this._lastSearchText = currentSearchText; // Sincronizar _lastSearchText con la búsqueda que se va a realizar\n this.getAutocompleteByTextHandler(currentSearchText);\n } else {\n }\n }\n });\n\n // Suscribirse al cierre del panel para remover el listener de scroll y manejar la deselección\n this.matAutocomplete.closed\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n if (this.matAutocomplete?.panel) {\n this.matAutocomplete.panel.nativeElement.removeEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n }\n\n const currentInputValue = this.component.value;\n const currentInputText = this.getAutocompleteSearchText();\n\n // Lógica para manejar el borrado del input si no hay una selección válida\n // o si el texto no coincide con el elemento seleccionado.\n if (typeof currentInputValue === \"string\") {\n // Si el input está vacío Y no hay un elemento seleccionado\n if (currentInputText === \"\" && !this._selectedElement) {\n this.clearInternalState(); // Usa un método para limpiar\n }\n // Si se requiere selección y el texto no coincide con el elemento seleccionado,\n // o no hay ningún elemento seleccionado, entonces se borra.\n else if (\n this.requireSelection &&\n (!this._selectedElement ||\n currentInputText !== this.displayFn(this._selectedElement))\n ) {\n console.warn(\n \"Autocompletado cerrado: Selección requerida y no se encontró una coincidencia válida. Limpiando input.\",\n );\n this.clearInternalState(); // Usa un método para limpiar\n }\n // Si NO se requiere selección, pero el usuario ha editado el texto de un elemento previamente seleccionado.\n // En este caso, NO borramos, sino que revertimos al texto del elemento seleccionado si existe.\n else if (\n this._selectedElement &&\n currentInputText !== this.displayFn(this._selectedElement) &&\n !this.requireSelection\n ) {\n // Revertir al texto del elemento seleccionado.\n this.component.setValue(this._selectedElement, {\n emitEvent: false,\n });\n this._lastSearchText = this.displayFn(this._selectedElement);\n this.propagateChange(this._selectedElement); // Propagar el valor original si se revierte\n }\n // Si el texto del input es un string y no se requiere selección,\n // y no hay _selectedElement (porque se deseleccionó en el tap o nunca hubo),\n // asumimos que el usuario quiere el texto libre.\n // No hacemos nada, el texto permanece.\n else if (\n typeof currentInputValue === \"string\" &&\n !this.requireSelection &&\n !this._selectedElement &&\n currentInputText !== \"\"\n ) {\n // Si no hay un elemento seleccionado pero el usuario escribió algo\n // y no se requiere selección, dejamos el texto tal cual.\n // Aseguramos que _lastSearchText se actualice para evitar re-búsquedas innecesarias.\n this._lastSearchText = currentInputText;\n // this.propagateChange(currentInputText);\n }\n }\n // Si el valor ya es un objeto (porque se seleccionó) pero el texto del input fue borrado\n // y el _selectedElement es null (ya se desvinculó en el tap), significa que debe limpiarse.\n else if (\n typeof currentInputValue === \"object\" &&\n currentInputText === \"\" &&\n !this._selectedElement\n ) {\n this.clearInternalState();\n }\n });\n }\n\n /**\n * Método auxiliar para limpiar el estado interno del autocompletado.\n * Este método ahora se encarga de la limpieza profunda, incluyendo el valor del FormControl y la propagación.\n * @param resetLastSearchText - Si es true, reinicia _lastSearchText a una cadena vacía. Por defecto es true.\n */\n private clearInternalState(resetLastSearchText: boolean = true): void {\n // Solo si el valor del control NO es null, lo seteamos a null para evitar bucles.\n // Esto es importante porque en el tap, solo desvinculamos `_selectedElement` pero no el control.\n if (this.component.value !== null) {\n this.component.setValue(null, { emitEvent: false });\n }\n this.propagateChange(null);\n this.SelectElement.emit(null);\n this._selectedElement = null; // Asegurar que el objeto seleccionado esté a null\n this._isOptionSelected = false; // Asegurar que la bandera de selección esté a false\n if (resetLastSearchText) {\n this._lastSearchText = \"\";\n }\n this.resetAutocompleteState(); // Resetear opciones y paginación\n }\n\n /**\n * Busca elementos para mostrar en el componente de autocompletado.\n * Ahora soporta paginación.\n * @param text - Texto a buscar\n */\n private getAutocompleteByTextHandler(\n text?: string,\n returnObservable: boolean = false,\n ): Observable<any> | void {\n const currentSearchText = text ?? \"\";\n\n if (this.loading()) {\n return returnObservable ? of(null) : undefined;\n }\n\n if (\n !this.hasMore() &&\n this._offset > 0 &&\n currentSearchText === this._lastSearchText\n ) {\n return returnObservable ? of(null) : undefined;\n }\n\n this.loading.set(true);\n\n const currentOffset = this._offset;\n\n console.log(this._serviceConfig);\n\n if (!this._url && !this._serviceConfig) {\n console.warn(\n \"Autocompletado: Se requiere el input 'url' o '_serviceConfig'.\",\n );\n this.loading.set(false);\n this.hasMore.set(false);\n return returnObservable ? of(null) : undefined;\n }\n\n let apiCall: Observable<any>;\n\n if (this._url) {\n apiCall = from(\n this._autocompleteService.getAutocompleteByText(\n this._url,\n currentSearchText,\n this.filterString,\n this._restrictionsFilters,\n this.removeProperties,\n this.order,\n this.bodyRequest,\n { limit: this._limit, offset: currentOffset },\n ),\n ).pipe(switchMap((innerObservable) => innerObservable));\n } else if (this._serviceConfig) {\n const body: any = { ...this._serviceConfig };\n body[this._serviceConfig.searchProperty] = currentSearchText;\n body[\"limit\"] = this._limit;\n body[\"offset\"] = currentOffset;\n Object.keys(this._serviceConfig.postBody).forEach((item) => {\n body[item] = this._serviceConfig.postBody[item];\n });\n console.log(body);\n delete body.service;\n delete body.postBody;\n apiCall = this._serviceConfig.service[this._serviceConfig.method](body);\n } else {\n this.loading.set(false);\n this.hasMore.set(false);\n return returnObservable ? of(null) : undefined;\n }\n\n let panelScrollTop = 0;\n if (this.matAutocomplete?.panel) {\n panelScrollTop = this.matAutocomplete.panel.nativeElement.scrollTop;\n }\n\n const finalApiCall$ = apiCall.pipe(\n finalize((): void => {\n this.loading.set(false);\n }),\n );\n\n if (returnObservable) {\n return finalApiCall$;\n }\n\n finalApiCall$.pipe(takeUntilDestroyed(this._destroyRef)).subscribe({\n next: (result: any): void => {\n const newData = result?.payload?.data ?? result?.data ?? [];\n\n if (currentOffset === 0) {\n this.originalOptions.set(newData);\n } else {\n this.originalOptions.update((currentOptions) => [\n ...currentOptions,\n ...newData,\n ]);\n }\n\n this._offset += newData.length;\n\n if (newData.length < this._limit) {\n this.hasMore.set(false);\n } else {\n this.hasMore.set(true);\n }\n\n this.filterOptionsBasedOnNotAllowed();\n\n if (this.matAutocomplete?.panel && panelScrollTop > 0) {\n this._zone.runOutsideAngular(() => {\n setTimeout(() => {\n this.matAutocomplete.panel.nativeElement.scrollTop =\n panelScrollTop;\n }, 0);\n });\n }\n },\n error: (error) => {\n console.error(\"Error al obtener datos de autocompletado:\", error);\n this.loading.set(false);\n },\n });\n }\n\n private filterOptionsBasedOnNotAllowed(): void {\n let currentOptions = this.originalOptions();\n const modifiedOptions = this.modifyResultFn(currentOptions);\n if (modifiedOptions !== null && modifiedOptions !== undefined) {\n currentOptions = modifiedOptions;\n }\n\n if (this.notAllowedOption()) {\n this.filteredOptions.set(\n currentOptions.filter(\n (option: any): boolean =>\n JSON.stringify(option) !== JSON.stringify(this.notAllowedOption()),\n ),\n );\n } else {\n this.filteredOptions.set(currentOptions);\n }\n }\n\n /**\n * Define el texto a utilizar para la búsqueda\n */\n private getAutocompleteSearchText(): string {\n const value = this.component.value;\n if (typeof value === \"object\" && value !== null) {\n // Si el valor es un objeto, usa displayFn para obtener el texto\n return this.displayFn(value);\n } else if (typeof value === \"string\") {\n return value;\n }\n return null;\n }\n\n // --- Métodos de ControlValueAccessor ---\n propagateChange = (_: any): void => {};\n\n registerOnChange(fn: (_: any) => void): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(): void {}\n\n /**\n * Recibe el valor desde el FormControl externo.\n */\n writeValue(value: any): void {\n // Establecer la bandera para indicar que el cambio viene de un setValue programático\n this._isOptionSelected = typeof value === \"object\" && value !== null;\n this.component.setValue(value, { emitEvent: false }); // No emitir evento para evitar bucles.\n\n this._selectedElement = value\n ? this.valueId && typeof value === \"object\"\n ? value?.id\n : value\n : null;\n\n // Actualizar _lastSearchText basado en el valor que se está escribiendo.\n // Si el valor es nulo, _lastSearchText también debe ser nulo o vacío\n if (value) {\n this._lastSearchText = this.displayFn(value);\n } else {\n this._lastSearchText = \"\";\n }\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n if (isDisabled) {\n this.component.disable();\n } else {\n this.component.enable();\n }\n }\n\n /**\n * Función para mostrar los elementos seleccionados\n */\n public displayFn = (value: any): string => {\n if (!value) {\n return \"\";\n }\n // Si el valor ya es una cadena, devuélvelo directamente\n if (typeof value === \"string\") {\n return value;\n }\n\n let displayText: string = \"\";\n const options = this.displayOptions || GENERAL_DISPLAY_OPTIONS;\n\n options?.firthLabel?.forEach((field: any): void => {\n if (field?.type === DisplayOptionItemType.PATH) {\n displayText +=\n UtilsService.resolvePropertyByPath(value, field?.path) || \"\";\n } else {\n displayText += field?.divider || \"\";\n }\n });\n\n return displayText;\n };\n\n /**\n * Acción al limpiar el valor del input\n */\n public clear(trigger: MatAutocompleteTrigger): void {\n this.clearElement.emit(this.component.value);\n this.clearInternalState(); // Usa el método auxiliar para limpiar\n this._zone.run((): void => {\n setTimeout((): void => {\n trigger.openPanel(); // Reabrir el panel después de borrar\n this.component.setValue(\"\", { emitEvent: true }); // Cargar opciones iniciales (o todas) después de borrar\n }, 100);\n });\n }\n\n /**\n * Acción al enfocar el elemento\n */\n public onFocus(): void {\n // Si el panel ya está abierto, no hacer nada para evitar bucles o recargas innecesarias al volver a hacer clic.\n if (this.autocompleteTrigger?.panelOpen) {\n return;\n }\n\n this.resetAutocompleteState();\n\n if (!this._selectedElement) {\n this._onFocusTriggeredSearch = true;\n const searchText = this.getAutocompleteSearchText() ?? \"\";\n // Forzar una búsqueda. El evento `opened` también se disparará,\n // pero el flag `_onFocusTriggeredSearch` debería prevenir una doble petición.\n this.getAutocompleteByTextHandler(searchText);\n }\n }\n\n public optionSelected($event: any): void {\n const selectedValue = $event?.option?.value;\n if (selectedValue) {\n this._isOptionSelected = true; // Establecer la bandera de selección\n this._selectedElement = selectedValue;\n this.SelectElement.emit(selectedValue);\n\n if (this.valueId && typeof selectedValue === \"object\") {\n this.propagateChange(selectedValue?.id);\n } else {\n this.propagateChange(selectedValue);\n }\n // Cuando un ítem es seleccionado, actualizar _lastSearchText con su valor de display.\n // Esto es crucial para que el valueChanges no vuelva a disparar una búsqueda para este valor.\n this._lastSearchText = this.displayFn(selectedValue);\n } else {\n // Si se deselecciona o selecciona nulo\n this.clearInternalState();\n }\n }\n\n /**\n * Maneja el evento de scroll en el panel del autocompletado para cargar más datos.\n */\n onScroll(event: Event): void {\n const element = event.target as HTMLElement;\n const scrollPosition = element.scrollTop + element.clientHeight;\n const scrollHeight = element.scrollHeight;\n const threshold = 50; // Píxeles antes del final para cargar más\n\n if (\n scrollHeight - scrollPosition <= threshold &&\n !this.loading() &&\n this.hasMore()\n ) {\n // Usar el texto de búsqueda actual (que puede ser el texto del ítem seleccionado o lo que el usuario escribió)\n this.getAutocompleteByTextHandler(this.getAutocompleteSearchText());\n }\n }\n}\n\n/**\n * Validación personalizada para la selección de elementos\n */\nexport function autocompleteValidator(\n control: AbstractControl,\n): ValidationErrors | null {\n // Un valor válido es un objeto no nulo que tiene una propiedad 'id'.\n // Esto asegura que realmente se ha seleccionado un objeto del autocompletado, no solo texto libre.\n // Si el control está vacío, no se aplica esta validación aquí, sino la de 'Validators.required' si está presente.\n if (\n control.value === null ||\n typeof control.value === \"undefined\" ||\n control.value === \"\"\n ) {\n return null; // Deja que Validators.required maneje si está vacío.\n }\n\n if (\n typeof control?.value === \"object\" &&\n control?.value !== null &&\n \"id\" in control.value\n ) {\n return null;\n }\n // Si el valor es una cadena (texto libre) y debería ser un objeto seleccionado.\n return { invalidSelection: true };\n}\n","<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n","/*\n * Public API Surface of guachos-general-autocomplete\n */\n\nexport * from './utils/constants/constants';\nexport * from './lib/guachos-general-autocomplete.component';\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":"guajiritos-general-autocomplete.mjs","sources":["../../../projects/guachos-general-autocomplete/src/utils/constants/constants.ts","../../../projects/guachos-general-autocomplete/src/utils/services/utils.service.ts","../../../projects/guachos-general-autocomplete/src/utils/pipes/resolve-property-path.pipe.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.html","../../../projects/guachos-general-autocomplete/src/public-api.ts","../../../projects/guachos-general-autocomplete/src/guajiritos-general-autocomplete.ts"],"sourcesContent":["import { DisplayOption, DisplayOptionItemType } from '@guajiritos/services';\nimport {DisplayOptionItem} from \"@guajiritos/services/lib/interfaces/interfaces\";\n\n\nexport const GENERAL_DISPLAY_OPTIONS: DisplayOption = {\n firthLabel: [\n {\n type: DisplayOptionItemType.PATH,\n path: ['name']\n }\n ],\n applyTranslate: true\n};\n\nexport interface ServiceConfig {\n service: any;\n method: string;\n postBody: any;\n searchProperty: string;\n [key: string]: any;\n}\n","import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UtilsService {\n /**\n * Resolves the value of a property in an object by providing a path.\n *\n * @param {any} obj - The object to traverse.\n * @param {string[]} path - An array of strings representing the path to the desired property.\n * @return {any} The value of the property at the given path, or null if the path is invalid.\n */\n public static resolvePropertyByPath(obj: any, path: string[]): any {\n return path.reduce((prev, curr: string) => {\n return prev ? prev[curr] : null;\n }, obj || self);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { DisplayOptionItem, DisplayOptionItemType } from '@guajiritos/services';\n\nimport { UtilsService } from '../services/utils.service';\n\n@Pipe({\n name: 'resolvePropertyPath',\n standalone: true\n})\nexport class ResolvePropertyPath implements PipeTransform {\n /**\n * Transforms the given object based on the provided path and returns the transformed string.\n *\n * @param {any} obj - The object to be transformed.\n * @param {DisplayOptionItem[]} path - The array of display option items used for transformation.\n * @return {string} The transformed string.\n */\n transform(obj: any, path: DisplayOptionItem[]): string {\n let result: string = '';\n\n path?.forEach((item: DisplayOptionItem): void => {\n if (item?.type === DisplayOptionItemType.DIVIDER) {\n result += item?.divider;\n } else {\n if (item?.path) {\n result += UtilsService.resolvePropertyByPath(obj, item.path);\n }\n }\n });\n\n return result;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n NgZone,\n Output,\n signal,\n TemplateRef,\n ViewChild,\n WritableSignal,\n} from \"@angular/core\";\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n UntypedFormControl,\n ValidationErrors,\n ValidatorFn,\n Validators,\n} from \"@angular/forms\";\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n MatAutocompleteTrigger,\n} from \"@angular/material/autocomplete\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { ThemePalette } from \"@angular/material/core\";\nimport {\n FloatLabelType,\n MatFormFieldAppearance,\n MatFormFieldModule,\n SubscriptSizing,\n} from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\nimport { TranslateModule, TranslateService } from \"@ngx-translate/core\";\nimport {\n debounceTime,\n finalize,\n Observable,\n Subject,\n from,\n switchMap,\n tap,\n of,\n catchError,\n} from \"rxjs\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\n\nimport {\n ApiFormData,\n AutocompleteService,\n DisplayOption,\n DisplayOptionItemType,\n I18nPipe,\n RestrictionFilter,\n} from \"@guajiritos/services\";\n\nimport {\n GENERAL_DISPLAY_OPTIONS,\n ServiceConfig,\n} from \"../utils/constants/constants\";\nimport { ResolvePropertyPath } from \"../utils/pipes/resolve-property-path.pipe\";\nimport { UtilsService } from \"../utils/services/utils.service\";\n\n@Component({\n selector: \"guajiritos-general-autocomplete\",\n templateUrl: \"./guachos-general-autocomplete.component.html\",\n styleUrls: [\"./guachos-general-autocomplete.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatFormFieldModule,\n TranslateModule,\n MatIconModule,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n MatProgressSpinnerModule,\n MatAutocompleteModule,\n I18nPipe,\n ResolvePropertyPath,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => GuajiritosGeneralAutocomplete),\n multi: true,\n },\n ],\n})\nexport class GuajiritosGeneralAutocomplete\n implements ControlValueAccessor, AfterViewInit\n{\n constructor(\n private _autocompleteService: AutocompleteService,\n private _zone: NgZone,\n private _destroyRef: DestroyRef,\n public translateService: TranslateService,\n ) {}\n\n // --- Propiedades Privadas ---\n private _isOptionSelected: boolean = false; // Indica si la última actualización del input fue por una selección explícita desde el autocompletado\n private _onFocusTriggeredSearch = false;\n private _userInteracted = false;\n private _clearDataSubject: Subject<void> = new Subject<void>();\n private _doFocusSubject: Subject<void> = new Subject<void>();\n private _selectedElement: any = null; // Almacena el objeto completo seleccionado\n private _url: string | null = null;\n private _serviceConfig: ServiceConfig = null;\n private _limit: number = 20;\n private _offset: number = 0;\n private _restrictionsFilters: RestrictionFilter[] = [];\n private _lastSearchText: string = \"\"; // Almacena el texto usado en la última búsqueda de API exitosa\n\n // --- Señales Públicas (Signals) ---\n public disabled: WritableSignal<boolean> = signal(false);\n public loading: WritableSignal<boolean> = signal(false);\n public required: WritableSignal<boolean> = signal(false);\n public filteredOptions: WritableSignal<any[]> = signal([]);\n public originalOptions: WritableSignal<any[]> = signal([]);\n public notAllowedOption: WritableSignal<any> = signal(null);\n public component: UntypedFormControl = new UntypedFormControl({\n value: null,\n disabled: false,\n });\n public hasMore: WritableSignal<boolean> = signal(true); // Indica si hay más datos para cargar\n\n // --- ViewChildren ---\n @ViewChild(\"inputText\", { static: true }) inputText!: ElementRef;\n @ViewChild(\"auto\") matAutocomplete!: MatAutocomplete;\n @ViewChild(MatAutocompleteTrigger)\n autocompleteTrigger!: MatAutocompleteTrigger;\n\n // --- Inputs ---\n @Input() floatLabel: FloatLabelType = \"auto\";\n @Input() color: ThemePalette = \"accent\";\n @Input() appearance: MatFormFieldAppearance = \"outline\";\n @Input() subscriptSizing: SubscriptSizing = \"dynamic\";\n @Input() bodyRequest?: ApiFormData;\n @Input() debounceTimeValue: number = 300;\n @Input() detailsTemplate?: TemplateRef<any>;\n @Input() label: string = \"Seleccione\";\n @Input() showLabel: boolean = true;\n @Input() placeholder: string = \"Seleccione un elemento\";\n @Input() field: string[] = [\"name\"];\n @Input() filterString: string[] | string = \"filter[$and][name][$like]\";\n @Input() displayOptions: DisplayOption = GENERAL_DISPLAY_OPTIONS;\n @Input() withoutPaddingBottom: boolean = true;\n @Input() valueId: boolean = false;\n @Input() showSuffix: boolean = false;\n @Input() requireSelection: boolean = false;\n @Input() order?: string;\n @Input() suffixIcon: string = \"search\";\n @Input() removeProperties: string[] = [];\n @Input() modifyResultFn: (options: any[]) => any[] = (options: any[]) =>\n options;\n\n // --- Outputs ---\n @Output() SelectElement: EventEmitter<any> = new EventEmitter<any>();\n @Output() clearElement: EventEmitter<any> = new EventEmitter<any>();\n\n // --- Setters para Inputs ---\n @Input() set url(data: string) {\n if (data) {\n this._url = data;\n // Suscribirse a los cambios del componente una vez que la URL está disponible\n this.subscribeToComponentChanges();\n }\n }\n\n // --- Setters para Inputs ---\n @Input() set serviceConfig(data: ServiceConfig) {\n if (data) {\n console.log(data);\n this._serviceConfig = data;\n // Suscribirse a los cambios del componente una vez que la URL está disponible\n this.subscribeToComponentChanges();\n }\n }\n\n @Input() set limit(value: number) {\n if (value && !isNaN(value)) {\n this._limit = value;\n }\n }\n\n @Input() set clearData(value: Subject<void>) {\n this._clearDataSubject = value;\n this._clearDataSubject\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe({\n next: (): void => {\n this.clearInternalState();\n },\n });\n }\n\n @Input() set initialValue(value: any) {\n // Si el valor inicial es el mismo que el valor actual del control, no hacer nada para evitar bucles\n if (value === this.component.value) {\n return;\n }\n\n this._selectedElement = value;\n this._isOptionSelected = !!value; // Marcar como seleccionado si hay un valor inicial\n\n // Establecer el valor en el formControl sin emitir el evento\n // para evitar que subscribeToComponentChanges reaccione a esta carga inicial.\n this.component.setValue(value, { emitEvent: false });\n\n // Actualizar _lastSearchText basado en el valor inicial\n if (value) {\n this._lastSearchText = this.displayFn(value);\n } else {\n this._lastSearchText = \"\";\n }\n }\n\n /**\n * Añade o elimina restricciones de búsqueda\n */\n @Input() set restrictions(restrictions: RestrictionFilter[]) {\n // Using stringify for simple object comparison. If restrictions become complex, a more robust method is needed.\n if (JSON.stringify(this._restrictionsFilters) === JSON.stringify(restrictions)) {\n return;\n }\n\n this._restrictionsFilters = restrictions?.length ? [...restrictions] : [];\n this.resetAutocompleteState();\n const currentSearchText = this.getAutocompleteSearchText();\n\n // Only re-trigger a search if there was already text in the input.\n // If the input was empty, we'll wait for user interaction (opening the panel).\n if (currentSearchText) {\n // No actualizar _lastSearchText aquí, se actualiza después de la API.\n this.getAutocompleteByTextHandler(currentSearchText);\n }\n }\n\n /**\n * Añade o elimina la validación de requerido\n */\n @Input() set isRequired(required: boolean) {\n this.required.set(required);\n const validators: ValidatorFn[] = [autocompleteValidator];\n if (required) {\n validators.push(Validators.required);\n }\n this.component.setValidators(validators);\n this.component.updateValueAndValidity();\n this.component.markAsDirty();\n this.component.markAsTouched();\n }\n\n /**\n * Define si se realiza una búsqueda cuando el elemento está en foco\n */\n @Input() set doFocus(focusSubject: Subject<void>) {\n this._doFocusSubject = focusSubject;\n this._doFocusSubject\n .pipe(\n debounceTime(this.debounceTimeValue), // Retrasar para evitar llamadas excesivas\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (): void => {\n // SOLO ejecutar si el usuario ya ha interactu-ado con el componente.\n // Esto previene que un focus programático inicial (ej: al renderizar una tabla)\n // dispare una búsqueda no deseada.\n if (!this._userInteracted) {\n return;\n }\n\n this._zone.run((): void => {\n setTimeout((): void => {\n this.inputText?.nativeElement?.focus();\n // Simular evento 'input' para disparar valueChanges, pero solo si el input está vacío\n // o si ya hay un valor pero no es el seleccionado (usuario queriendo buscar de nuevo).\n if (\n !this.component.value ||\n (typeof this.component.value === \"string\" &&\n !this._selectedElement)\n ) {\n (\n this.inputText?.nativeElement as HTMLInputElement\n )?.dispatchEvent(new Event(\"input\"));\n }\n this.autocompleteTrigger?.openPanel();\n }, 50); // Un pequeño retraso para asegurar el foco y la apertura\n });\n },\n });\n }\n\n @Input() set notAllowedElements(element: any) {\n if (element) {\n this.notAllowedOption.set(element);\n this.filterOptionsBasedOnNotAllowed();\n }\n }\n\n /**\n * Reinicia el estado de paginación y opciones del autocompletado.\n * Centraliza la lógica para evitar duplicación.\n */\n private resetAutocompleteState(): void {\n this._offset = 0;\n this.originalOptions.set([]);\n this.filteredOptions.set([]);\n this.hasMore.set(true);\n }\n\n /**\n * Suscripción a los cambios del input de búsqueda\n */\n private subscribeToComponentChanges(): void {\n this.component.valueChanges\n .pipe(\n // TAP se ejecuta inmediatamente ANTES del debounce.\n // Esto es crucial para detectar borrados de texto en tiempo real y desvincular _selectedElement.\n tap((value) => {\n const currentInputText = this.getAutocompleteSearchText();\n\n // Si el valor actual del control es un STRING (usuario escribiendo/borrando)\n // Y previamente había un objeto seleccionado (_selectedElement)\n // Y el texto en el input ya no coincide con el displayFn del _selectedElement,\n // entonces desvinculamos el _selectedElement y marcamos que no hay selección.\n if (\n typeof value === \"string\" &&\n this._selectedElement &&\n currentInputText !== this.displayFn(this._selectedElement)\n ) {\n this._selectedElement = null; // Quitar la referencia al objeto seleccionado\n this._isOptionSelected = false; // Marcar que no hay una opción seleccionada\n } else if (typeof value === \"string\") {\n // Si el valor es un string, simplemente marcamos que no hay opción seleccionada.\n // Esto cubre los casos donde el usuario escribe por primera vez o borra sin haber seleccionado.\n this._isOptionSelected = false;\n }\n }),\n debounceTime(this.debounceTimeValue), // El debounce se aplica después de la lógica del tap\n switchMap((value: any) => {\n const currentSearchText = this.getAutocompleteSearchText();\n\n // Caso 1: El valor es un objeto y coincide con el elemento seleccionado.\n if (\n typeof value === \"object\" &&\n value !== null &&\n this._selectedElement === value\n ) {\n this._lastSearchText = this.displayFn(value);\n return of(null);\n }\n\n // Caso 2: El usuario ha terminado de escribir o borrar texto.\n if (currentSearchText !== this._lastSearchText) {\n this.resetAutocompleteState();\n this._lastSearchText = currentSearchText;\n const source$ = this.getAutocompleteByTextHandler(\n currentSearchText,\n true,\n ) as Observable<any>;\n\n return source$.pipe(\n catchError(() => {\n // Al atrapar el error aquí, evitamos que la cadena principal de valueChanges se rompa.\n // Devolvemos un observable vacío para que la suscripción continúe escuchando cambios.\n return of(null);\n }),\n );\n } else {\n // Si el texto es el mismo, pero el panel está abierto, sin opciones y hay más datos potenciales,\n // podemos necesitar una recarga.\n if (\n this.matAutocomplete._isOpen &&\n this.originalOptions().length === 0 &&\n this.hasMore() &&\n !this.loading()\n ) {\n return this.getAutocompleteByTextHandler(\n currentSearchText,\n true,\n ) as Observable<any>;\n }\n }\n return of(null);\n }),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (result: any): void => {\n if (!result) {\n return;\n }\n\n const newData = result?.payload?.data ?? result?.data ?? [];\n\n if (this._offset === 0) {\n this.originalOptions.set(newData);\n } else {\n this.originalOptions.update((currentOptions) => [\n ...currentOptions,\n ...newData,\n ]);\n }\n\n this._offset += newData.length;\n\n if (newData.length < this._limit) {\n this.hasMore.set(false);\n } else {\n this.hasMore.set(true);\n }\n\n this.filterOptionsBasedOnNotAllowed();\n },\n error: (error) => {\n this.loading.set(false);\n },\n });\n }\n\n ngAfterViewInit(): void {\n // Suscribirse a la apertura del panel para añadir el listener de scroll y cargar datos\n this.matAutocomplete.opened\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n if (this._onFocusTriggeredSearch) {\n this._onFocusTriggeredSearch = false;\n return;\n }\n\n if (this.matAutocomplete?.panel) {\n // Asegurarse de que el listener sea removido antes de añadirlo para prevenir duplicados\n this.matAutocomplete.panel.nativeElement.removeEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n this.matAutocomplete.panel.nativeElement.addEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n\n const currentSearchText = this.getAutocompleteSearchText();\n\n // **********************************************\n // MODIFICACIÓN CLAVE AQUÍ:\n // Cargar opciones iniciales SOLO SI:\n // 1. No hay opciones cargadas (primera apertura o después de un clear/reset).\n // 2. O el texto actual en el input es diferente del _lastSearchText (el usuario escribió algo nuevo o borró y abrió).\n // 3. O el input está vacío Y no hay un _selectedElement Y hay más datos por cargar Y el offset es 0 (lo que implica que es la primera carga para este estado vacío).\n // Esto evita la doble llamada si subscribeToComponentChanges ya disparó una búsqueda\n // para el mismo texto, o si ya se sabe que no hay más datos para un input vacío.\n // **********************************************\n if (\n this.originalOptions().length === 0 || // No hay opciones, cargar siempre.\n currentSearchText !== this._lastSearchText || // El texto ha cambiado, nueva búsqueda.\n (currentSearchText === \"\" &&\n !this._selectedElement &&\n this.hasMore() &&\n this._offset === 0) // Input vacío, sin selección, con potencial de datos, y es la primera carga.\n ) {\n this.resetAutocompleteState(); // Asegurarse de resetear antes de una nueva carga\n this._lastSearchText = currentSearchText; // Sincronizar _lastSearchText con la búsqueda que se va a realizar\n this.getAutocompleteByTextHandler(currentSearchText);\n } else {\n }\n }\n });\n\n // Suscribirse al cierre del panel para remover el listener de scroll y manejar la deselección\n this.matAutocomplete.closed\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n if (this.matAutocomplete?.panel) {\n this.matAutocomplete.panel.nativeElement.removeEventListener(\n \"scroll\",\n this.onScroll.bind(this),\n );\n }\n\n const currentInputValue = this.component.value;\n const currentInputText = this.getAutocompleteSearchText();\n\n // Lógica para manejar el borrado del input si no hay una selección válida\n // o si el texto no coincide con el elemento seleccionado.\n if (typeof currentInputValue === \"string\") {\n // Si el input está vacío Y no hay un elemento seleccionado\n if (currentInputText === \"\" && !this._selectedElement) {\n this.clearInternalState(); // Usa un método para limpiar\n }\n // Si se requiere selección y el texto no coincide con el elemento seleccionado,\n // o no hay ningún elemento seleccionado, entonces se borra.\n else if (\n this.requireSelection &&\n (!this._selectedElement ||\n currentInputText !== this.displayFn(this._selectedElement))\n ) {\n console.warn(\n \"Autocompletado cerrado: Selección requerida y no se encontró una coincidencia válida. Limpiando input.\",\n );\n this.clearInternalState(); // Usa un método para limpiar\n }\n // Si NO se requiere selección, pero el usuario ha editado el texto de un elemento previamente seleccionado.\n // En este caso, NO borramos, sino que revertimos al texto del elemento seleccionado si existe.\n else if (\n this._selectedElement &&\n currentInputText !== this.displayFn(this._selectedElement) &&\n !this.requireSelection\n ) {\n // Revertir al texto del elemento seleccionado.\n this.component.setValue(this._selectedElement, {\n emitEvent: false,\n });\n this._lastSearchText = this.displayFn(this._selectedElement);\n this.propagateChange(this._selectedElement); // Propagar el valor original si se revierte\n }\n // Si el texto del input es un string y no se requiere selección,\n // y no hay _selectedElement (porque se deseleccionó en el tap o nunca hubo),\n // asumimos que el usuario quiere el texto libre.\n // No hacemos nada, el texto permanece.\n else if (\n typeof currentInputValue === \"string\" &&\n !this.requireSelection &&\n !this._selectedElement &&\n currentInputText !== \"\"\n ) {\n // Si no hay un elemento seleccionado pero el usuario escribió algo\n // y no se requiere selección, dejamos el texto tal cual.\n // Aseguramos que _lastSearchText se actualice para evitar re-búsquedas innecesarias.\n this._lastSearchText = currentInputText;\n // this.propagateChange(currentInputText);\n }\n }\n // Si el valor ya es un objeto (porque se seleccionó) pero el texto del input fue borrado\n // y el _selectedElement es null (ya se desvinculó en el tap), significa que debe limpiarse.\n else if (\n typeof currentInputValue === \"object\" &&\n currentInputText === \"\" &&\n !this._selectedElement\n ) {\n this.clearInternalState();\n }\n });\n }\n\n /**\n * Método auxiliar para limpiar el estado interno del autocompletado.\n * Este método ahora se encarga de la limpieza profunda, incluyendo el valor del FormControl y la propagación.\n * @param resetLastSearchText - Si es true, reinicia _lastSearchText a una cadena vacía. Por defecto es true.\n */\n private clearInternalState(resetLastSearchText: boolean = true): void {\n // Solo si el valor del control NO es null, lo seteamos a null para evitar bucles.\n // Esto es importante porque en el tap, solo desvinculamos `_selectedElement` pero no el control.\n if (this.component.value !== null) {\n this.component.setValue(null, { emitEvent: false });\n }\n this.propagateChange(null);\n this.SelectElement.emit(null);\n this._selectedElement = null; // Asegurar que el objeto seleccionado esté a null\n this._isOptionSelected = false; // Asegurar que la bandera de selección esté a false\n if (resetLastSearchText) {\n this._lastSearchText = \"\";\n }\n this.resetAutocompleteState(); // Resetear opciones y paginación\n }\n\n /**\n * Busca elementos para mostrar en el componente de autocompletado.\n * Ahora soporta paginación.\n * @param text - Texto a buscar\n */\n private getAutocompleteByTextHandler(\n text?: string,\n returnObservable: boolean = false,\n ): Observable<any> | void {\n const currentSearchText = text ?? \"\";\n\n if (this.loading() || !this._userInteracted) {\n return returnObservable ? of(null) : undefined;\n }\n\n if (\n !this.hasMore() &&\n this._offset > 0 &&\n currentSearchText === this._lastSearchText\n ) {\n return returnObservable ? of(null) : undefined;\n }\n\n this.loading.set(true);\n\n const currentOffset = this._offset;\n\n console.log(this._serviceConfig);\n\n if (!this._url && !this._serviceConfig) {\n console.warn(\n \"Autocompletado: Se requiere el input 'url' o '_serviceConfig'.\",\n );\n this.loading.set(false);\n this.hasMore.set(false);\n return returnObservable ? of(null) : undefined;\n }\n\n let apiCall: Observable<any>;\n\n if (this._url) {\n apiCall = from(\n this._autocompleteService.getAutocompleteByText(\n this._url,\n currentSearchText,\n this.filterString,\n this._restrictionsFilters,\n this.removeProperties,\n this.order,\n this.bodyRequest,\n { limit: this._limit, offset: currentOffset },\n ),\n ).pipe(switchMap((innerObservable) => innerObservable));\n } else if (this._serviceConfig) {\n const body: any = { ...this._serviceConfig };\n body[this._serviceConfig.searchProperty] = currentSearchText;\n body[\"limit\"] = this._limit;\n body[\"offset\"] = currentOffset;\n Object.keys(this._serviceConfig.postBody).forEach((item) => {\n body[item] = this._serviceConfig.postBody[item];\n });\n console.log(body);\n delete body.service;\n delete body.postBody;\n apiCall = this._serviceConfig.service[this._serviceConfig.method](body);\n } else {\n this.loading.set(false);\n this.hasMore.set(false);\n return returnObservable ? of(null) : undefined;\n }\n\n let panelScrollTop = 0;\n if (this.matAutocomplete?.panel) {\n panelScrollTop = this.matAutocomplete.panel.nativeElement.scrollTop;\n }\n\n const finalApiCall$ = apiCall.pipe(\n finalize((): void => {\n this.loading.set(false);\n }),\n );\n\n if (returnObservable) {\n return finalApiCall$;\n }\n\n finalApiCall$.pipe(takeUntilDestroyed(this._destroyRef)).subscribe({\n next: (result: any): void => {\n const newData = result?.payload?.data ?? result?.data ?? [];\n\n if (currentOffset === 0) {\n this.originalOptions.set(newData);\n } else {\n this.originalOptions.update((currentOptions) => [\n ...currentOptions,\n ...newData,\n ]);\n }\n\n this._offset += newData.length;\n\n if (newData.length < this._limit) {\n this.hasMore.set(false);\n } else {\n this.hasMore.set(true);\n }\n\n this.filterOptionsBasedOnNotAllowed();\n\n if (this.matAutocomplete?.panel && panelScrollTop > 0) {\n this._zone.runOutsideAngular(() => {\n setTimeout(() => {\n this.matAutocomplete.panel.nativeElement.scrollTop =\n panelScrollTop;\n }, 0);\n });\n }\n },\n error: (error) => {\n console.error(\"Error al obtener datos de autocompletado:\", error);\n this.loading.set(false);\n },\n });\n }\n\n private filterOptionsBasedOnNotAllowed(): void {\n let currentOptions = this.originalOptions();\n const modifiedOptions = this.modifyResultFn(currentOptions);\n if (modifiedOptions !== null && modifiedOptions !== undefined) {\n currentOptions = modifiedOptions;\n }\n\n if (this.notAllowedOption()) {\n this.filteredOptions.set(\n currentOptions.filter(\n (option: any): boolean =>\n JSON.stringify(option) !== JSON.stringify(this.notAllowedOption()),\n ),\n );\n } else {\n this.filteredOptions.set(currentOptions);\n }\n }\n\n /**\n * Define el texto a utilizar para la búsqueda\n */\n private getAutocompleteSearchText(): string {\n const value = this.component.value;\n if (typeof value === \"object\" && value !== null) {\n // Si el valor es un objeto, usa displayFn para obtener el texto\n return this.displayFn(value);\n } else if (typeof value === \"string\") {\n return value;\n }\n return null;\n }\n\n // --- Métodos de ControlValueAccessor ---\n propagateChange = (_: any): void => {};\n\n registerOnChange(fn: (_: any) => void): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(): void {}\n\n /**\n * Recibe el valor desde el FormControl externo.\n */\n writeValue(value: any): void {\n // Establecer la bandera para indicar que el cambio viene de un setValue programático\n this._isOptionSelected = typeof value === \"object\" && value !== null;\n this.component.setValue(value, { emitEvent: false }); // No emitir evento para evitar bucles.\n\n this._selectedElement = value\n ? this.valueId && typeof value === \"object\"\n ? value?.id\n : value\n : null;\n\n // Actualizar _lastSearchText basado en el valor que se está escribiendo.\n // Si el valor es nulo, _lastSearchText también debe ser nulo o vacío\n if (value) {\n this._lastSearchText = this.displayFn(value);\n } else {\n this._lastSearchText = \"\";\n }\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n if (isDisabled) {\n this.component.disable();\n } else {\n this.component.enable();\n }\n }\n\n /**\n * Función para mostrar los elementos seleccionados\n */\n public displayFn = (value: any): string => {\n if (!value) {\n return \"\";\n }\n // Si el valor ya es una cadena, devuélvelo directamente\n if (typeof value === \"string\") {\n return value;\n }\n\n let displayText: string = \"\";\n const options = this.displayOptions || GENERAL_DISPLAY_OPTIONS;\n\n options?.firthLabel?.forEach((field: any): void => {\n if (field?.type === DisplayOptionItemType.PATH) {\n displayText +=\n UtilsService.resolvePropertyByPath(value, field?.path) || \"\";\n } else {\n displayText += field?.divider || \"\";\n }\n });\n\n return displayText;\n };\n\n /**\n * Acción al limpiar el valor del input\n */\n public clear(trigger: MatAutocompleteTrigger): void {\n this.clearElement.emit(this.component.value);\n this.clearInternalState(); // Usa el método auxiliar para limpiar\n this._zone.run((): void => {\n setTimeout((): void => {\n trigger.openPanel(); // Reabrir el panel después de borrar\n this.component.setValue(\"\", { emitEvent: true }); // Cargar opciones iniciales (o todas) después de borrar\n }, 100);\n });\n }\n\n /**\n * Acción al enfocar el elemento\n */\n public onFocus(): void {\n if (!this._userInteracted) {\n return;\n }\n\n // Si el panel ya está abierto, no hacer nada para evitar bucles o recargas innecesarias al volver a hacer clic.\n if (this.autocompleteTrigger?.panelOpen) {\n return;\n }\n\n this.resetAutocompleteState();\n\n if (!this._selectedElement) {\n this._onFocusTriggeredSearch = true;\n const searchText = this.getAutocompleteSearchText() ?? \"\";\n // Forzar una búsqueda. El evento `opened` también se disparará,\n // pero el flag `_onFocusTriggeredSearch` debería prevenir una doble petición.\n this.getAutocompleteByTextHandler(searchText);\n }\n }\n\n public onUserInteraction(): void {\n this._userInteracted = true;\n if (this.autocompleteTrigger?.panelOpen) {\n return;\n }\n\n this.resetAutocompleteState();\n\n if (!this._selectedElement) {\n this._onFocusTriggeredSearch = true;\n const searchText = this.getAutocompleteSearchText() ?? \"\";\n // Forzar una búsqueda. El evento `opened` también se disparará,\n // pero el flag `_onFocusTriggeredSearch` debería prevenir una doble petición.\n this.getAutocompleteByTextHandler(searchText);\n }\n }\n\n public optionSelected($event: any): void {\n const selectedValue = $event?.option?.value;\n if (selectedValue) {\n this._isOptionSelected = true; // Establecer la bandera de selección\n this._selectedElement = selectedValue;\n this.SelectElement.emit(selectedValue);\n\n if (this.valueId && typeof selectedValue === \"object\") {\n this.propagateChange(selectedValue?.id);\n } else {\n this.propagateChange(selectedValue);\n }\n // Cuando un ítem es seleccionado, actualizar _lastSearchText con su valor de display.\n // Esto es crucial para que el valueChanges no vuelva a disparar una búsqueda para este valor.\n this._lastSearchText = this.displayFn(selectedValue);\n } else {\n // Si se deselecciona o selecciona nulo\n this.clearInternalState();\n }\n }\n\n /**\n * Maneja el evento de scroll en el panel del autocompletado para cargar más datos.\n */\n onScroll(event: Event): void {\n const element = event.target as HTMLElement;\n const scrollPosition = element.scrollTop + element.clientHeight;\n const scrollHeight = element.scrollHeight;\n const threshold = 50; // Píxeles antes del final para cargar más\n\n if (\n scrollHeight - scrollPosition <= threshold &&\n !this.loading() &&\n this.hasMore()\n ) {\n // Usar el texto de búsqueda actual (que puede ser el texto del ítem seleccionado o lo que el usuario escribió)\n this.getAutocompleteByTextHandler(this.getAutocompleteSearchText());\n }\n }\n}\n\n/**\n * Validación personalizada para la selección de elementos\n */\nexport function autocompleteValidator(\n control: AbstractControl,\n): ValidationErrors | null {\n // Un valor válido es un objeto no nulo que tiene una propiedad 'id'.\n // Esto asegura que realmente se ha seleccionado un objeto del autocompletado, no solo texto libre.\n // Si el control está vacío, no se aplica esta validación aquí, sino la de 'Validators.required' si está presente.\n if (\n control.value === null ||\n typeof control.value === \"undefined\" ||\n control.value === \"\"\n ) {\n return null; // Deja que Validators.required maneje si está vacío.\n }\n\n if (\n typeof control?.value === \"object\" &&\n control?.value !== null &&\n \"id\" in control.value\n ) {\n return null;\n }\n // Si el valor es una cadena (texto libre) y debería ser un objeto seleccionado.\n return { invalidSelection: true };\n}\n","<mat-form-field\n [floatLabel]=\"floatLabel\"\n class=\"w-100\"\n [appearance]=\"appearance\"\n [color]=\"color\"\n [subscriptSizing]=\"subscriptSizing\"\n>\n @if (showLabel) {\n <mat-label>{{ label | translate }}</mat-label>\n } @if (showSuffix) {\n <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n }\n <input\n #inputText\n #trigger=\"matAutocompleteTrigger\"\n (focus)=\"onFocus()\"\n (click)=\"onUserInteraction()\"\n (keydown)=\"onUserInteraction()\"\n [formControl]=\"component\"\n type=\"text\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder | translate\"\n aria-label=\"autocomplete\"\n autocomplete=\"off\"\n matInput\n [required]=\"required()\"\n />\n @if (!loading() && component.value) {\n <button\n (click)=\"clear(trigger)\"\n [disabled]=\"disabled()\"\n aria-label=\"Clear\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n } @if (loading()) {\n <button aria-label=\"search\" mat-icon-button matSuffix>\n <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n </button>\n }\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [requireSelection]=\"requireSelection\"\n (optionSelected)=\"optionSelected($event)\"\n >\n @for (option of filteredOptions(); track option) {\n <mat-option [value]=\"option\">\n @if (!displayOptions && !detailsTemplate) {\n {{ option?.name | i18n: translateService.currentLang }}\n } @if (!detailsTemplate) {\n <div class=\"display-options\">\n <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n {{\n option | resolvePropertyPath : displayOptions.firthLabel\n | i18n : translateService.currentLang\n }}\n </span>\n @if (displayOptions?.secondLabel) {\n <span class=\"mat-caption\">\n {{\n option | resolvePropertyPath : displayOptions.secondLabel\n | i18n : translateService.currentLang\n }}\n </span>\n }\n </div>\n } @if (detailsTemplate) {\n <ng-container\n *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n ></ng-container>\n }\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (component.invalid && component.touched) {\n <mat-error>\n {{ 'Este campo es requerido.' | translate }}\n </mat-error>\n }\n</mat-form-field>\n","/*\n * Public API Surface of guachos-general-autocomplete\n */\n\nexport * from './utils/constants/constants';\nexport * from './lib/guachos-general-autocomplete.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAM,uBAAuB,GAAkB;AAClD,IAAA,UAAU,EAAE;AACR,QAAA;YACI,IAAI,EAAE,qBAAqB,CAAC,IAAI;YAChC,IAAI,EAAE,CAAC,MAAM;AAChB;AACJ,KAAA;AACD,IAAA,cAAc,EAAE;;;MCNP,YAAY,CAAA;AACrB;;;;;;AAMG;AACI,IAAA,OAAO,qBAAqB,CAAC,GAAQ,EAAE,IAAc,EAAA;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAY,KAAI;AACtC,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AACnC,QAAA,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IACnB;+GAZS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFT,MAAM,EAAA,CAAA,CAAA;;4FAET,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCMY,mBAAmB,CAAA;AAC9B;;;;;;AAMG;IACH,SAAS,CAAC,GAAQ,EAAE,IAAyB,EAAA;QAC3C,IAAI,MAAM,GAAW,EAAE;AAEvB,QAAA,IAAI,EAAE,OAAO,CAAC,CAAC,IAAuB,KAAU;YAC9C,IAAI,IAAI,EAAE,IAAI,KAAK,qBAAqB,CAAC,OAAO,EAAE;AAChD,gBAAA,MAAM,IAAI,IAAI,EAAE,OAAO;YACzB;iBAAO;AACL,gBAAA,IAAI,IAAI,EAAE,IAAI,EAAE;oBACd,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;gBAC9D;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;+GAtBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MC2FY,6BAA6B,CAAA;AAGxC,IAAA,WAAA,CACU,oBAAyC,EACzC,KAAa,EACb,WAAuB,EACxB,gBAAkC,EAAA;QAHjC,IAAA,CAAA,oBAAoB,GAApB,oBAAoB;QACpB,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,WAAW,GAAX,WAAW;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;;AAIjB,QAAA,IAAA,CAAA,iBAAiB,GAAY,KAAK,CAAC;QACnC,IAAA,CAAA,uBAAuB,GAAG,KAAK;QAC/B,IAAA,CAAA,eAAe,GAAG,KAAK;AACvB,QAAA,IAAA,CAAA,iBAAiB,GAAkB,IAAI,OAAO,EAAQ;AACtD,QAAA,IAAA,CAAA,eAAe,GAAkB,IAAI,OAAO,EAAQ;AACpD,QAAA,IAAA,CAAA,gBAAgB,GAAQ,IAAI,CAAC;QAC7B,IAAA,CAAA,IAAI,GAAkB,IAAI;QAC1B,IAAA,CAAA,cAAc,GAAkB,IAAI;QACpC,IAAA,CAAA,MAAM,GAAW,EAAE;QACnB,IAAA,CAAA,OAAO,GAAW,CAAC;QACnB,IAAA,CAAA,oBAAoB,GAAwB,EAAE;AAC9C,QAAA,IAAA,CAAA,eAAe,GAAW,EAAE,CAAC;;AAG9B,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAM,CAAC,KAAK,CAAC;AACjD,QAAA,IAAA,CAAA,OAAO,GAA4B,MAAM,CAAC,KAAK,CAAC;AAChD,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAM,CAAC,KAAK,CAAC;AACjD,QAAA,IAAA,CAAA,eAAe,GAA0B,MAAM,CAAC,EAAE,CAAC;AACnD,QAAA,IAAA,CAAA,eAAe,GAA0B,MAAM,CAAC,EAAE,CAAC;AACnD,QAAA,IAAA,CAAA,gBAAgB,GAAwB,MAAM,CAAC,IAAI,CAAC;QACpD,IAAA,CAAA,SAAS,GAAuB,IAAI,kBAAkB,CAAC;AAC5D,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC;AACK,QAAA,IAAA,CAAA,OAAO,GAA4B,MAAM,CAAC,IAAI,CAAC,CAAC;;QAS9C,IAAA,CAAA,UAAU,GAAmB,MAAM;QACnC,IAAA,CAAA,KAAK,GAAiB,QAAQ;QAC9B,IAAA,CAAA,UAAU,GAA2B,SAAS;QAC9C,IAAA,CAAA,eAAe,GAAoB,SAAS;QAE5C,IAAA,CAAA,iBAAiB,GAAW,GAAG;QAE/B,IAAA,CAAA,KAAK,GAAW,YAAY;QAC5B,IAAA,CAAA,SAAS,GAAY,IAAI;QACzB,IAAA,CAAA,WAAW,GAAW,wBAAwB;AAC9C,QAAA,IAAA,CAAA,KAAK,GAAa,CAAC,MAAM,CAAC;QAC1B,IAAA,CAAA,YAAY,GAAsB,2BAA2B;QAC7D,IAAA,CAAA,cAAc,GAAkB,uBAAuB;QACvD,IAAA,CAAA,oBAAoB,GAAY,IAAI;QACpC,IAAA,CAAA,OAAO,GAAY,KAAK;QACxB,IAAA,CAAA,UAAU,GAAY,KAAK;QAC3B,IAAA,CAAA,gBAAgB,GAAY,KAAK;QAEjC,IAAA,CAAA,UAAU,GAAW,QAAQ;QAC7B,IAAA,CAAA,gBAAgB,GAAa,EAAE;AAC/B,QAAA,IAAA,CAAA,cAAc,GAA8B,CAAC,OAAc,KAClE,OAAO;;AAGC,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAO;AAC1D,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO;;AAujBnE,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,CAAM,KAAU,EAAE,CAAC;AAwCtC;;AAEG;AACI,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,KAAU,KAAY;YACxC,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,OAAO,EAAE;YACX;;AAEA,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,OAAO,KAAK;YACd;YAEA,IAAI,WAAW,GAAW,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,uBAAuB;YAE9D,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAU,KAAU;gBAChD,IAAI,KAAK,EAAE,IAAI,KAAK,qBAAqB,CAAC,IAAI,EAAE;oBAC9C,WAAW;wBACT,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE;gBAChE;qBAAO;AACL,oBAAA,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,EAAE;gBACrC;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,WAAW;AACpB,QAAA,CAAC;IArrBE;;IAgEH,IAAa,GAAG,CAAC,IAAY,EAAA;QAC3B,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;YAEhB,IAAI,CAAC,2BAA2B,EAAE;QACpC;IACF;;IAGA,IAAa,aAAa,CAAC,IAAmB,EAAA;QAC5C,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;;YAE1B,IAAI,CAAC,2BAA2B,EAAE;QACpC;IACF;IAEA,IAAa,KAAK,CAAC,KAAa,EAAA;QAC9B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACrB;IACF;IAEA,IAAa,SAAS,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAW;gBACf,IAAI,CAAC,kBAAkB,EAAE;YAC3B,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAa,YAAY,CAAC,KAAU,EAAA;;QAElC,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YAClC;QACF;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC7B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC;;;AAIjC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;QAGpD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9C;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;IACF;AAEA;;AAEG;IACH,IAAa,YAAY,CAAC,YAAiC,EAAA;;AAEzD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;YAC9E;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,GAAG,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE;QACzE,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;QAI1D,IAAI,iBAAiB,EAAE;;AAErB,YAAA,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,CAAC;QACtD;IACF;AAEA;;AAEG;IACH,IAAa,UAAU,CAAC,QAAiB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAkB,CAAC,qBAAqB,CAAC;QACzD,IAAI,QAAQ,EAAE;AACZ,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;IAChC;AAEA;;AAEG;IACH,IAAa,OAAO,CAAC,YAA2B,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,GAAG,YAAY;AACnC,QAAA,IAAI,CAAC;aACF,IAAI,CACH,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,QAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAW;;;;AAIf,gBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACzB;gBACF;AAEA,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAW;oBACxB,UAAU,CAAC,MAAW;AACpB,wBAAA,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE;;;AAGtC,wBAAA,IACE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;AACrB,6BAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ;AACvC,gCAAA,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACzB;AAEE,4BAAA,IAAI,CAAC,SAAS,EAAE,aACjB,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;wBACtC;AACA,wBAAA,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE;AACvC,oBAAA,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,gBAAA,CAAC,CAAC;YACJ,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAa,kBAAkB,CAAC,OAAY,EAAA;QAC1C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAClC,IAAI,CAAC,8BAA8B,EAAE;QACvC;IACF;AAEA;;;AAGG;IACK,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEA;;AAEG;IACK,2BAA2B,GAAA;QACjC,IAAI,CAAC,SAAS,CAAC;aACZ,IAAI;;;AAGH,QAAA,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;;;YAMzD,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,IAAI,CAAC,gBAAgB;gBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC1D;AACA,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACjC;AAAO,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;;;AAGpC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAChC;QACF,CAAC,CAAC,EACF,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,QAAA,SAAS,CAAC,CAAC,KAAU,KAAI;AACvB,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;YAG1D,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,KAAK,IAAI;AACd,gBAAA,IAAI,CAAC,gBAAgB,KAAK,KAAK,EAC/B;gBACA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;YACjB;;AAGA,YAAA,IAAI,iBAAiB,KAAK,IAAI,CAAC,eAAe,EAAE;gBAC9C,IAAI,CAAC,sBAAsB,EAAE;AAC7B,gBAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB;gBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAC/C,iBAAiB,EACjB,IAAI,CACc;AAEpB,gBAAA,OAAO,OAAO,CAAC,IAAI,CACjB,UAAU,CAAC,MAAK;;;AAGd,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,CACH;YACH;iBAAO;;;AAGL,gBAAA,IACE,IAAI,CAAC,eAAe,CAAC,OAAO;AAC5B,oBAAA,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC;oBACnC,IAAI,CAAC,OAAO,EAAE;AACd,oBAAA,CAAC,IAAI,CAAC,OAAO,EAAE,EACf;oBACA,OAAO,IAAI,CAAC,4BAA4B,CACtC,iBAAiB,EACjB,IAAI,CACc;gBACtB;YACF;AACA,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,MAAW,KAAU;gBAC1B,IAAI,CAAC,MAAM,EAAE;oBACX;gBACF;AAEA,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE;AAE3D,gBAAA,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;AACtB,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;gBACnC;qBAAO;oBACL,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK;AAC9C,wBAAA,GAAG,cAAc;AACjB,wBAAA,GAAG,OAAO;AACX,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;gBAE9B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;qBAAO;AACL,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB;gBAEA,IAAI,CAAC,8BAA8B,EAAE;YACvC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,eAAe,CAAC;AAClB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aACzC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;AAChC,gBAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;gBACpC;YACF;AAEA,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;;gBAE/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAC1D,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;gBACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CACvD,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;AAED,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;;;;;;;;gBAW1D,IACE,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC;AACnC,oBAAA,iBAAiB,KAAK,IAAI,CAAC,eAAe;qBACzC,iBAAiB,KAAK,EAAE;wBACvB,CAAC,IAAI,CAAC,gBAAgB;wBACtB,IAAI,CAAC,OAAO,EAAE;AACd,wBAAA,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;kBACrB;AACA,oBAAA,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC9B,oBAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC;AACzC,oBAAA,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,CAAC;gBACtD;qBAAO;gBACP;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,eAAe,CAAC;AAClB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aACzC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAC1D,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;YACH;AAEA,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAC9C,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;AAIzD,YAAA,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;;gBAEzC,IAAI,gBAAgB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACrD,oBAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B;;;qBAGK,IACH,IAAI,CAAC,gBAAgB;qBACpB,CAAC,IAAI,CAAC,gBAAgB;wBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAC7D;AACA,oBAAA,OAAO,CAAC,IAAI,CACV,wGAAwG,CACzG;AACD,oBAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B;;;qBAGK,IACH,IAAI,CAAC,gBAAgB;oBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC1D,oBAAA,CAAC,IAAI,CAAC,gBAAgB,EACtB;;oBAEA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC7C,wBAAA,SAAS,EAAE,KAAK;AACjB,qBAAA,CAAC;oBACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;oBAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC9C;;;;;qBAKK,IACH,OAAO,iBAAiB,KAAK,QAAQ;oBACrC,CAAC,IAAI,CAAC,gBAAgB;oBACtB,CAAC,IAAI,CAAC,gBAAgB;oBACtB,gBAAgB,KAAK,EAAE,EACvB;;;;AAIA,oBAAA,IAAI,CAAC,eAAe,GAAG,gBAAgB;;gBAEzC;YACF;;;iBAGK,IACH,OAAO,iBAAiB,KAAK,QAAQ;AACrC,gBAAA,gBAAgB,KAAK,EAAE;AACvB,gBAAA,CAAC,IAAI,CAAC,gBAAgB,EACtB;gBACA,IAAI,CAAC,kBAAkB,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;;AAIG;IACK,kBAAkB,CAAC,sBAA+B,IAAI,EAAA;;;QAG5D,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACrD;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,mBAAmB,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;AACA,QAAA,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC;AAEA;;;;AAIG;AACK,IAAA,4BAA4B,CAClC,IAAa,EACb,gBAAA,GAA4B,KAAK,EAAA;AAEjC,QAAA,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE;QAEpC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC3C,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IACE,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,YAAA,iBAAiB,KAAK,IAAI,CAAC,eAAe,EAC1C;AACA,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO;AAElC,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;QAEhC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,OAAO,CAAC,IAAI,CACV,gEAAgE,CACjE;AACD,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IAAI,OAAwB;AAE5B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,OAAO,GAAG,IAAI,CACZ,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAC7C,IAAI,CAAC,IAAI,EACT,iBAAiB,EACjB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,oBAAoB,EACzB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW,EAChB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAC9C,CACF,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,KAAK,eAAe,CAAC,CAAC;QACzD;AAAO,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YAC9B,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,iBAAiB;AAC5D,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,aAAa;AAC9B,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACzD,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjD,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO;YACnB,OAAO,IAAI,CAAC,QAAQ;AACpB,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACzE;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;QAEA,IAAI,cAAc,GAAG,CAAC;AACtB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;YAC/B,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;QACrE;QAEA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,QAAQ,CAAC,MAAW;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,CACH;QAED,IAAI,gBAAgB,EAAE;AACpB,YAAA,OAAO,aAAa;QACtB;AAEA,QAAA,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,YAAA,IAAI,EAAE,CAAC,MAAW,KAAU;AAC1B,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE;AAE3D,gBAAA,IAAI,aAAa,KAAK,CAAC,EAAE;AACvB,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;gBACnC;qBAAO;oBACL,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK;AAC9C,wBAAA,GAAG,cAAc;AACjB,wBAAA,GAAG,OAAO;AACX,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;gBAE9B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;qBAAO;AACL,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB;gBAEA,IAAI,CAAC,8BAA8B,EAAE;gBAErC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE;AACrD,oBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;wBAChC,UAAU,CAAC,MAAK;AACd,4BAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;AAChD,gCAAA,cAAc;wBAClB,CAAC,EAAE,CAAC,CAAC;AACP,oBAAA,CAAC,CAAC;gBACJ;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AACjE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,8BAA8B,GAAA;AACpC,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;QAC3D,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE;YAC7D,cAAc,GAAG,eAAe;QAClC;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,cAAc,CAAC,MAAM,CACnB,CAAC,MAAW,KACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CACrE,CACF;QACH;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C;IACF;AAEA;;AAEG;IACK,yBAAyB,GAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;;AAE/C,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,IAAI;IACb;AAKA,IAAA,gBAAgB,CAAC,EAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAEA,IAAA,iBAAiB,KAAU;AAE3B;;AAEG;AACH,IAAA,UAAU,CAAC,KAAU,EAAA;;QAEnB,IAAI,CAAC,iBAAiB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;AACpE,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,gBAAgB,GAAG;cACpB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK;kBAC/B,KAAK,EAAE;AACT,kBAAE;cACF,IAAI;;;QAIR,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9C;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;IACF;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7B,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB;IACF;AA6BA;;AAEG;AACI,IAAA,KAAK,CAAC,OAA+B,EAAA;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAW;YACxB,UAAU,CAAC,MAAW;AACpB,gBAAA,OAAO,CAAC,SAAS,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE;YACvC;QACF;QAEA,IAAI,CAAC,sBAAsB,EAAE;AAE7B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE,IAAI,EAAE;;;AAGzD,YAAA,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC;QAC/C;IACF;IAEO,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE;YACvC;QACF;QAEA,IAAI,CAAC,sBAAsB,EAAE;AAE7B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE,IAAI,EAAE;;;AAGzD,YAAA,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC;QAC/C;IACF;AAEO,IAAA,cAAc,CAAC,MAAW,EAAA;AAC/B,QAAA,MAAM,aAAa,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK;QAC3C,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,gBAAgB,GAAG,aAAa;AACrC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;YAEtC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrD,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,CAAC;YACzC;iBAAO;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;YACrC;;;YAGA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QACtD;aAAO;;YAEL,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;AAC/D,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,QAAA,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,QAAA,IACE,YAAY,GAAG,cAAc,IAAI,SAAS;YAC1C,CAAC,IAAI,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,CAAC,OAAO,EAAE,EACd;;YAEA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrE;IACF;+GA5xBW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,GAAA,EAAA,KAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAR7B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,6BAA6B,CAAC;AAC5D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA0CU,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5InC,o9EAoFA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDJI,YAAY,0RACZ,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,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,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,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,mBAAmB,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,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,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,EACnB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,wBAAwB,kOACxB,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,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,GAAA,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,GAAA,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,MAAA,EAAA,IAAA,EACrB,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACR,mBAAmB,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAUV,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA3BzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,mBAG1B,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,cAAc;wBACd,eAAe;wBACf,wBAAwB;wBACxB,qBAAqB;wBACrB,QAAQ;wBACR,mBAAmB;qBACpB,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,mCAAmC,CAAC;AAC5D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,o9EAAA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA;qKAwCyC,SAAS,EAAA,CAAA;sBAAlD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACrB,eAAe,EAAA,CAAA;sBAAjC,SAAS;uBAAC,MAAM;gBAEjB,mBAAmB,EAAA,CAAA;sBADlB,SAAS;uBAAC,sBAAsB;gBAIxB,UAAU,EAAA,CAAA;sBAAlB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAIS,aAAa,EAAA,CAAA;sBAAtB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBAGY,GAAG,EAAA,CAAA;sBAAf;gBASY,aAAa,EAAA,CAAA;sBAAzB;gBASY,KAAK,EAAA,CAAA;sBAAjB;gBAMY,SAAS,EAAA,CAAA;sBAArB;gBAWY,YAAY,EAAA,CAAA;sBAAxB;gBAwBY,YAAY,EAAA,CAAA;sBAAxB;gBAqBY,UAAU,EAAA,CAAA;sBAAtB;gBAeY,OAAO,EAAA,CAAA;sBAAnB;gBAqCY,kBAAkB,EAAA,CAAA;sBAA9B;;AAmlBH;;AAEG;AACG,SAAU,qBAAqB,CACnC,OAAwB,EAAA;;;;AAKxB,IAAA,IACE,OAAO,CAAC,KAAK,KAAK,IAAI;AACtB,QAAA,OAAO,OAAO,CAAC,KAAK,KAAK,WAAW;AACpC,QAAA,OAAO,CAAC,KAAK,KAAK,EAAE,EACpB;QACA,OAAO,IAAI,CAAC;IACd;AAEA,IAAA,IACE,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ;QAClC,OAAO,EAAE,KAAK,KAAK,IAAI;AACvB,QAAA,IAAI,IAAI,OAAO,CAAC,KAAK,EACrB;AACA,QAAA,OAAO,IAAI;IACb;;AAEA,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;AE75BA;;AAEG;;ACFH;;AAEG;;;;"}
@@ -16,6 +16,7 @@ export declare class GuajiritosGeneralAutocomplete implements ControlValueAccess
16
16
  constructor(_autocompleteService: AutocompleteService, _zone: NgZone, _destroyRef: DestroyRef, translateService: TranslateService);
17
17
  private _isOptionSelected;
18
18
  private _onFocusTriggeredSearch;
19
+ private _userInteracted;
19
20
  private _clearDataSubject;
20
21
  private _doFocusSubject;
21
22
  private _selectedElement;
@@ -124,6 +125,7 @@ export declare class GuajiritosGeneralAutocomplete implements ControlValueAccess
124
125
  * Acción al enfocar el elemento
125
126
  */
126
127
  onFocus(): void;
128
+ onUserInteraction(): void;
127
129
  optionSelected($event: any): void;
128
130
  /**
129
131
  * Maneja el evento de scroll en el panel del autocompletado para cargar más datos.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guajiritos/general-autocomplete",
3
- "version": "19.0.18",
3
+ "version": "19.0.20",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^19.2.17",
6
6
  "@angular/common": "^19.2.12",