{"version":3,"file":"koalarx-ui-shared-components-input-field-autocomplete.mjs","sources":["../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-ref.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.html","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-builder.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-value.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.html","../../projects/koala-ui/shared/components/input-field/autocomplete/koalarx-ui-shared-components-input-field-autocomplete.ts"],"sourcesContent":["import {\n  ApplicationRef,\n  ComponentRef,\n  inject,\n  Injectable,\n  InjectionToken,\n  Type,\n} from '@angular/core';\nimport { AUTOCOMPLETE_APP_REF } from './autocomplete';\n\nexport const AUTOCOMPLETE_REF_TOKEN = new InjectionToken(\n  'AutocompleteRefToken'\n);\n\n@Injectable()\nexport class AutocompleteRef {\n  private readonly appRef = inject<ApplicationRef>(AUTOCOMPLETE_APP_REF);\n  private readonly componentRef = inject<() => ComponentRef<Type<any>>>(\n    AUTOCOMPLETE_REF_TOKEN\n  );\n\n  close() {\n    setTimeout(() => {\n      this.componentRef().destroy();\n      this.appRef.detachView(this.componentRef().hostView);\n    });\n  }\n}\n","import {\n  booleanAttribute,\n  Component,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  linkedSignal,\n  OnDestroy,\n  OnInit,\n  Signal,\n  signal,\n  viewChild,\n  ViewContainerRef,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\nimport { KlArray } from '@koalarx/utils/KlArray';\n\n@Component({\n  selector: 'kl-autocomplete-options',\n  templateUrl: './autocomplete-options.html',\n  imports: [ReactiveFormsModule],\n})\nexport class AutocompleteOptions implements OnInit, OnDestroy {\n  private readonly autocompleteRef = inject(AutocompleteRef);\n  private readonly viewContainerRef =\n    inject<ViewContainerRef>(ViewContainerRef);\n  private firstLoad = true;\n\n  fieldId = input.required<string>();\n  options = input.required<Signal<AutocompleteList>>();\n  control = input.required<FormControl>();\n  multiple = input.required<boolean>();\n  autocompleteValue = input.required<AutocompleteValue>();\n  placeholderSearchField = input<string | undefined>();\n  disableAutoTypeConversion = input(false, { transform: booleanAttribute });\n  list = linkedSignal(() => {\n    const options = this.options()();\n    return new KlArray(options).split(100)[0];\n  });\n\n  optionFocused = signal(0);\n\n  searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n  constructor() {\n    effect(() => {\n      const hasValue = !!this.autocompleteValue().currentValue();\n\n      if (this.firstLoad) {\n        this.firstLoad = false;\n        return;\n      }\n\n      if (hasValue && !this.multiple()) {\n        this.close();\n      }\n    });\n\n    effect(() => {\n      const options = this.options()();\n      if (options.length > 0) {\n        this.optionFocused.set(0);\n      }\n    });\n  }\n\n  private updateScrollPosition(direction: 'down' | 'up' = 'down') {\n    setTimeout(() => {\n      const containerElement =\n        this.viewContainerRef.element.nativeElement.querySelector(\n          '.kl-autocomplete-options-container'\n        ) as HTMLDivElement;\n      const focusedOptionElement = containerElement.querySelector(\n        'label.active'\n      ) as HTMLDivElement;\n\n      if (focusedOptionElement) {\n        containerElement.scrollTo({\n          top:\n            direction === 'down'\n              ? containerElement.scrollTop +\n                focusedOptionElement.getBoundingClientRect().height\n              : containerElement.scrollTop -\n                focusedOptionElement.getBoundingClientRect().height,\n        });\n      }\n    });\n  }\n\n  private onKeyDown = (event: KeyboardEvent) => {\n    switch (event.key) {\n      case 'ArrowDown': {\n        event.stopPropagation();\n        event.preventDefault();\n\n        this.optionFocused.update((value) => {\n          if (value < this.options()().length - 1) {\n            return value + 1;\n          }\n          return value;\n        });\n        this.updateScrollPosition('down');\n        break;\n      }\n      case 'ArrowUp': {\n        event.stopPropagation();\n        event.preventDefault();\n\n        this.optionFocused.update((value) => {\n          if (value > 0) {\n            return value - 1;\n          }\n          return value;\n        });\n        this.updateScrollPosition('up');\n        break;\n      }\n    }\n  };\n\n  private onKeyup = (event: KeyboardEvent) => {\n    const containerElement: HTMLDivElement =\n      this.viewContainerRef.element.nativeElement;\n\n    switch (event.key) {\n      case 'Enter': {\n        event.stopPropagation();\n        event.preventDefault();\n\n        const focusedOption = this.options()()[this.optionFocused()];\n\n        if (focusedOption) {\n          containerElement\n            .querySelectorAll<HTMLInputElement>('input')\n            .item(this.optionFocused() + 1)\n            .click();\n        }\n        break;\n      }\n      case 'Escape': {\n        event.stopPropagation();\n        event.preventDefault();\n\n        this.close();\n        break;\n      }\n    }\n  };\n\n  private onClick = (event: MouseEvent) => {\n    const containerElement: HTMLDivElement =\n      this.viewContainerRef.element.nativeElement;\n    const insideClick = containerElement.contains(event.target as Node);\n\n    if (!insideClick) {\n      event.stopPropagation();\n      event.preventDefault();\n      this.close();\n    }\n  };\n\n  private onScroll = (event: Event) => {\n    const container = this.viewContainerRef.element.nativeElement.querySelector(\n      '.kl-autocomplete-options-container'\n    );\n    const target = event.target as HTMLElement;\n\n    if (!container || !target.tagName) return;\n\n    if (target !== container) {\n      this.close();\n    }\n  };\n\n  private close() {\n    if (\n      this.autocompleteValue().filterControl.value &&\n      !this.autocompleteValue().isOnDemand()\n    ) {\n      this.autocompleteValue().filterControl.reset();\n    }\n\n    this.autocompleteRef.close();\n  }\n\n  ngOnDestroy() {\n    document.removeEventListener('keyup', this.onKeyup);\n    document.removeEventListener('keydown', this.onKeyDown);\n    document.removeEventListener('click', this.onClick);\n    window.removeEventListener('scroll', this.onScroll, true);\n  }\n\n  ngOnInit() {\n    this.searchInputRef()?.nativeElement.focus();\n\n    setTimeout(() => {\n      document.addEventListener('keyup', this.onKeyup);\n      document.addEventListener('keydown', this.onKeyDown);\n      document.addEventListener('click', this.onClick);\n      window.addEventListener('scroll', this.onScroll, true);\n    }, 150);\n  }\n\n  setValue(event: Event) {\n    const target = event.target as HTMLInputElement;\n\n    let value: string | number = target.value;\n\n    if (\n      !Number.isNaN(parseInt(value as any)) &&\n      !/^0+[1-9]\\d*$/.test(value) &&\n      !this.disableAutoTypeConversion()\n    ) {\n      value = Number(value);\n    }\n\n    if (this.multiple()) {\n      const check = target.checked;\n\n      let currentValue = this.control().value;\n\n      if (!Array.isArray(currentValue)) {\n        currentValue = [currentValue];\n      }\n\n      if (check) {\n        this.control().setValue([...currentValue, value]);\n      } else {\n        this.control().setValue(currentValue.filter((v: any) => v !== value));\n      }\n    } else {\n      this.control().setValue(value);\n    }\n  }\n}\n","<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n  [attr.aria-labelledby]=\"fieldId()\">\n\n  <div class=\"kl-autocomplete-filter border-b border-neutral-200 dark:border-neutral-700\">\n    <label class=\"flex items-center text-sm\">\n      <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n      <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n        #searchInput\n        type=\"search\"\n        [formControl]=\"autocompleteValue().filterControl\"\n        placeholder=\"Type to Search...\"\n      />\n    </label>\n  </div>\n\n  <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n    @for (item of list(); track $index) {\n      @let optionLabelId = fieldId() + '-' + item.value;\n\n      <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n        [attr.for]=\"optionLabelId\"\n        [class.active]=\"$index === optionFocused()\"\n        (mouseover)=\"optionFocused.set($index)\">\n\n        <input\n          [type]=\"multiple() ? 'checkbox' : 'radio'\"\n          [id]=\"optionLabelId\"\n          [name]=\"fieldId()\"\n          [attr.value]=\"item.value\"\n          [checked]=\"multiple()\n            ? control().value?.includes(item.value)\n            : item.value === control().value\"\n          (change)=\"setValue($event)\"\n        />\n        {{item.label}}\n      </label>\n    }\n  </div>\n</div>\n","import {\n  ApplicationRef,\n  createComponent,\n  EnvironmentInjector,\n  inject,\n  Injectable,\n  InjectionToken,\n  Injector,\n  inputBinding,\n  Signal,\n  ViewContainerRef,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { GENERIC_COMPONENT_CONTAINER_NAME } from '@koalarx/ui/core/config';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { randomString } from '@koalarx/utils/KlString';\nimport { AutocompleteOptions } from './autocomplete-options';\nimport { AUTOCOMPLETE_REF_TOKEN, AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\n\nexport type AutocompleteAfterCloseTrigger = string | Record<string, any>;\nexport type AutocompleteAfterCloseTriggerFn = (\n  trigger: AutocompleteAfterCloseTrigger\n) => void;\nexport const AUTOCOMPLETE_APP_REF = new InjectionToken('AutocompleteAppRef');\n\nexport interface AutocompleteOpenData {\n  fieldId: string;\n  options: Signal<AutocompleteList>;\n  control: FormControl<any>;\n  multiple: boolean;\n  autocompleteValue: AutocompleteValue;\n  placeholderSearchField?: string;\n  disableAutoTypeConversion?: boolean;\n}\n\n@Injectable()\nexport class Autocomplete {\n  private readonly appRef = inject(ApplicationRef);\n  private readonly viewContainerRef = inject(ViewContainerRef);\n  private readonly injector = inject(EnvironmentInjector);\n\n  private generateElementId() {\n    let elementId: string;\n\n    do {\n      elementId = randomString(50, {\n        numbers: false,\n        lowercase: true,\n        uppercase: true,\n        specialCharacters: false,\n      });\n    } while (document.getElementById(elementId));\n\n    return elementId;\n  }\n\n  private calculatePosition(container: HTMLDivElement) {\n    const autocompleteField = this.viewContainerRef.element\n      .nativeElement as HTMLElement;\n    const currentTop = window.scrollY;\n    const position = autocompleteField.getBoundingClientRect();\n    const optionsContainer = container.querySelector<HTMLDivElement>(\n      '.kl-autocomplete-options-container'\n    );\n    const filterContainer = container?.querySelector<HTMLDivElement>(\n      '.kl-autocomplete-filter'\n    );\n    const filterContainerHeight = (filterContainer?.clientHeight || 0) + 2;\n\n    if (position) {\n      const screenHeight = document.body.clientHeight;\n      const maxHeight = (screenHeight * 40) / 100;\n      let top = position.bottom;\n      let height = Math.abs(screenHeight - top);\n\n      if (height > maxHeight) {\n        height = maxHeight;\n      }\n\n      const percentFillOnScreen = (height * 100) / screenHeight;\n\n      if (percentFillOnScreen <= 20) {\n        const optionsHeight = optionsContainer?.scrollHeight || 0;\n        const currentHeight = optionsHeight + filterContainerHeight;\n\n        if (optionsHeight > 0 && currentHeight <= maxHeight) {\n          height = currentHeight;\n        } else {\n          height = Math.abs(screenHeight - (screenHeight - position.top));\n\n          if (height > maxHeight) {\n            height = maxHeight;\n          }\n        }\n\n        top = position.top - height;\n      }\n\n      top += currentTop;\n\n      container.style.top = `${top}px`;\n      container.style.maxHeight = `${height}px`;\n\n      return { top, left: position.left, width: position.width, height };\n    }\n\n    return null;\n  }\n\n  private async waitForButtonEnabled(\n    buttonElement: HTMLButtonElement,\n    timeout: number\n  ) {\n    const delayTime = 50;\n\n    let ellapsedTime = 0;\n\n    while (buttonElement.disabled && ellapsedTime <= timeout) {\n      await delay(delayTime);\n      ellapsedTime += delayTime;\n    }\n  }\n\n  private async positionOnScreen(container: HTMLDivElement) {\n    const autocompleteField = this.viewContainerRef.element\n      .nativeElement as HTMLElement;\n    const autocompleteFieldButton =\n      autocompleteField.querySelector<HTMLButtonElement>('button');\n\n    if (autocompleteFieldButton) {\n      await this.waitForButtonEnabled(autocompleteFieldButton, 5000);\n    }\n\n    const position = this.calculatePosition(container);\n\n    if (position) {\n      const { left, width } = position;\n\n      container.style.position = 'absolute';\n      container.style.display = 'flex';\n      container.style.left = `${left}px`;\n      container.style.width = `${width}px`;\n      container.style.height = `auto`;\n      container.style.zIndex = '99';\n      container.style.overflow = 'hidden';\n      container.style.transition = 'all 0.1s ease-in-out';\n\n      const selectedOptions =\n        autocompleteField.querySelector<HTMLDivElement>('.selected-options');\n\n      if (selectedOptions) {\n        selectedOptions.onchange = () => this.positionOnScreen(container);\n      }\n    }\n  }\n\n  async open(data: AutocompleteOpenData) {\n    const main = document.querySelector<HTMLElement>(\n      GENERIC_COMPONENT_CONTAINER_NAME\n    );\n\n    if (main) {\n      const elementId = this.generateElementId();\n      const container = main.appendChild(document.createElement('div'));\n\n      container.id = elementId;\n\n      await this.positionOnScreen(container);\n\n      const componentRef = createComponent(AutocompleteOptions, {\n        environmentInjector: this.injector,\n        hostElement: container,\n        elementInjector: Injector.create({\n          providers: [\n            { provide: AUTOCOMPLETE_APP_REF, useValue: this.appRef },\n            {\n              provide: AUTOCOMPLETE_REF_TOKEN,\n              useValue: () => componentRef,\n            },\n            {\n              provide: AutocompleteRef,\n              deps: [AUTOCOMPLETE_APP_REF, AUTOCOMPLETE_REF_TOKEN],\n            },\n          ],\n        }),\n        bindings: [\n          ...Object.keys(data).map((key) =>\n            inputBinding(key, () => (data as any)[key])\n          ),\n        ],\n      });\n\n      this.appRef.attachView(componentRef.hostView);\n\n      componentRef.changeDetectorRef.detectChanges();\n\n      this.calculatePosition(container);\n    }\n  }\n}\n","import { Injectable, ResourceRef, Signal } from '@angular/core';\nimport {\n  AutocompleteDataOptionsFn,\n  AutocompleteList,\n} from './autocomplete-value';\n\n@Injectable({ providedIn: 'root' })\nexport class AutocompleteBuilder {\n  onDemand(config: AutocompleteDataOptionsFn) {\n    return config;\n  }\n\n  onServer(config: ResourceRef<AutocompleteList>) {\n    return config;\n  }\n\n  inMemory(config: AutocompleteList) {\n    return config;\n  }\n\n  inMemoryWithLoading(config: Signal<AutocompleteList>) {\n    return config;\n  }\n}\n","import {\n  computed,\n  DestroyRef,\n  inject,\n  Injectable,\n  ResourceRef,\n  signal,\n  Signal,\n  WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl } from '@angular/forms';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\n\nexport type AutocompleteOptionValue = string | number | null;\n\nexport interface AutocompleteOption<TData = any> {\n  label: string;\n  value: AutocompleteOptionValue;\n  data?: TData;\n}\n\nexport type AutocompleteList = AutocompleteOption[];\nexport interface AutocompleteDataOptionsFnParams {\n  filter?: string | null;\n  autofill?: any | null;\n  internalFilter?: string | null;\n}\n\nexport type AutocompleteDataOptionsFn = (\n  data: Signal<AutocompleteDataOptionsFnParams>\n) => ResourceRef<AutocompleteList>;\n\nexport type AutocompleteDataOptions =\n  | AutocompleteDataOptionsFn\n  | ResourceRef<AutocompleteList>\n  | Signal<AutocompleteList>\n  | AutocompleteList;\n\n@Injectable()\nexport class AutocompleteValue {\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly _filter = signal<string | null>('');\n  private _control?: FormControl<any>;\n  private readonly _currentValue = signal<\n    AutocompleteOption | AutocompleteOption[] | null\n  >(null);\n  private _multiple = false;\n  private _options?: Signal<AutocompleteList>;\n  private _autofill = signal<any | null>(null);\n  private _isLoading?: Signal<boolean>;\n  private _internalFilter = signal<string | null>(null);\n  private _isOnDemand?: WritableSignal<boolean>;\n  private readonly _requestOptionsParams =\n    signal<AutocompleteDataOptionsFnParams>({\n      filter: null,\n      autofill: null,\n    });\n\n  private readonly _selectedOption = computed(() => {\n    const currentValue = this._currentValue();\n\n    if (Array.isArray(currentValue)) {\n      return null;\n    }\n\n    return currentValue;\n  });\n\n  private readonly _selectedOptions = computed(() => {\n    const currentValue = this._currentValue();\n\n    if (Array.isArray(currentValue)) {\n      return currentValue;\n    }\n\n    return [];\n  });\n\n  private readonly _hasValue = computed(() => {\n    const currentValue = this._currentValue();\n    const value = Array.isArray(currentValue)\n      ? currentValue\n      : currentValue?.value;\n\n    if (Array.isArray(value)) {\n      return value.length > 0;\n    } else if (typeof value === 'number') {\n      return value >= 0;\n    }\n\n    return !!value;\n  });\n\n  filterControl = new FormControl<string | null>('');\n\n  get filter() {\n    return this._filter.asReadonly();\n  }\n\n  get hasValue() {\n    return this._hasValue;\n  }\n\n  get currentValue() {\n    return this._currentValue.asReadonly();\n  }\n\n  get selectedOption() {\n    return this._selectedOption;\n  }\n\n  get selectedOptions() {\n    return this._selectedOptions;\n  }\n\n  get autofill() {\n    return this._autofill.asReadonly();\n  }\n\n  get requestOptionsParams() {\n    return this._requestOptionsParams.asReadonly();\n  }\n\n  set internalFilter(value: string | null) {\n    this._internalFilter.set(value);\n    this._requestOptionsParams.update(() => ({\n      filter: this.filterControl.enabled ? null : this.filterControl.value,\n      internalFilter: this._internalFilter(),\n      autofill: null,\n    }));\n  }\n\n  get isOnDemand() {\n    if (!this._isOnDemand) {\n      return signal(false);\n    }\n    return this._isOnDemand.asReadonly();\n  }\n\n  private selectedOptionIsDiff(\n    options: AutocompleteOption | AutocompleteOption[]\n  ) {\n    if (this._multiple) {\n      return (\n        !Array.isArray(options) ||\n        options.length !== this._selectedOptions().length ||\n        options.some(\n          (opt, index) => opt.value !== this._selectedOptions()[index].value\n        )\n      );\n    }\n\n    return (\n      !options ||\n      (options as AutocompleteOption).value !== this._selectedOption()?.value\n    );\n  }\n\n  private async selectOption(value: any) {\n    while (this._isLoading!()) {\n      await delay(100);\n    }\n\n    if (!this._options) {\n      return;\n    }\n\n    const options = this._multiple\n      ? this._options()?.filter((opt) => `${value}`?.includes(`${opt.value}`))\n      : this._options()?.find((opt) => `${opt.value}` === `${value}`);\n\n    if (!isEmpty(value) && !options && this._isOnDemand!()) {\n      this._requestOptionsParams.update(() => ({\n        internalFilter: this._internalFilter(),\n        autofill: value,\n      }));\n\n      await delay(100);\n\n      this.selectOption(value);\n\n      return;\n    }\n\n    if (options && this.selectedOptionIsDiff(options)) {\n      this._currentValue.update(() => {\n        if (this._multiple) {\n          if (Array.isArray(options)) {\n            return options;\n          }\n\n          return [options];\n        }\n\n        return options;\n      });\n    }\n  }\n\n  async makeAutofill() {\n    if (!isEmpty(this._control?.value)) {\n      while (this._isLoading!()) {\n        await delay(100);\n      }\n\n      this.selectOption(this._control?.value);\n\n      const currentValue = this._currentValue();\n\n      if (\n        (this._multiple &&\n          ((Array.isArray(currentValue) && currentValue.length === 0) ||\n            !Array.isArray(currentValue))) ||\n        (!this._multiple && isEmpty(currentValue))\n      ) {\n        this._autofill.set(this._control?.value);\n        this._requestOptionsParams.update((params) => ({\n          ...params,\n          internalFilter: this._internalFilter(),\n          autofill: this._autofill(),\n        }));\n      }\n    }\n  }\n\n  init(\n    control: FormControl<any>,\n    options: Signal<AutocompleteList>,\n    isLoading: Signal<boolean>,\n    isOnDemand: WritableSignal<boolean>,\n    multiple = false\n  ) {\n    this._control = control;\n    this._options = options;\n    this._multiple = multiple;\n    this._isLoading = isLoading;\n    this._isOnDemand = isOnDemand;\n\n    this.filterControl.valueChanges\n      .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(500))\n      .subscribe((value) => {\n        this._autofill.set(null);\n        this._filter.set(value);\n        this._requestOptionsParams.update(() => ({\n          filter: value,\n          internalFilter: this._internalFilter(),\n          autofill: null,\n        }));\n      });\n\n    this._control.valueChanges\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((value) => this.selectOption(value));\n  }\n\n  clear(event: MouseEvent) {\n    event.preventDefault();\n    this._control?.setValue(null);\n    this._currentValue.set(null);\n    this._requestOptionsParams.update(() => ({\n      filter: null,\n      internalFilter: this._internalFilter(),\n      autofill: null,\n    }));\n  }\n\n  remove(event: MouseEvent, value: AutocompleteOptionValue) {\n    event.preventDefault();\n    if (!this._multiple) {\n      return;\n    }\n\n    if (!this._control) {\n      return;\n    }\n\n    const currentValue = this._control.value;\n\n    this._control?.setValue(\n      currentValue.filter((v: AutocompleteOptionValue) => v !== value)\n    );\n  }\n}\n","import {\n  booleanAttribute,\n  Component,\n  effect,\n  inject,\n  Injector,\n  input,\n  isSignal,\n  linkedSignal,\n  OnInit,\n  ResourceRef,\n  runInInjectionContext,\n  Signal,\n  signal,\n} from '@angular/core';\nimport { Loader } from '@koalarx/ui/core/components/loader';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { HookChange } from '@koalarx/ui/shared/directives';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { Autocomplete } from './autocomplete';\nimport {\n  AutocompleteDataOptions,\n  AutocompleteDataOptionsFn,\n  AutocompleteList,\n  AutocompleteValue,\n} from './autocomplete-value';\n\ninterface OptionsResource {\n  onDemand?: ResourceRef<AutocompleteList>;\n  onServer?: ResourceRef<AutocompleteList>;\n  inMemory?: AutocompleteList;\n  inMemoryWithLoading?: Signal<AutocompleteList>;\n}\n\n@Component({\n  selector: 'kl-autocomplete-field',\n  templateUrl: './autocomplete-field.html',\n  providers: [Autocomplete, AutocompleteValue],\n  imports: [Loader, FieldErrors, HookChange],\n})\nexport class AutocompleteField extends InputFieldBase implements OnInit {\n  private readonly injector = inject(Injector);\n\n  readonly autocompleteValue = inject(AutocompleteValue);\n  readonly autocomplete = inject(Autocomplete);\n\n  readonly options = input.required<AutocompleteDataOptions>();\n  readonly multiple = input(false, { transform: booleanAttribute });\n  readonly placeholderSearchField = input<string>();\n  readonly disableAutoTypeConversion = input(false, {\n    transform: booleanAttribute,\n  });\n\n  readonly isLoading = signal<boolean>(false);\n  readonly optionList = signal<AutocompleteList>([]);\n\n  readonly optionsResource = signal<OptionsResource | null>(null);\n  readonly isOnDemand = linkedSignal(\n    () => this.optionsResource()?.onDemand !== undefined\n  );\n\n  constructor() {\n    super();\n\n    effect(() => {\n      const optionList = this.optionList();\n      const autofill = this.autocompleteValue.autofill();\n\n      if (optionList.length > 0 && !isEmpty(autofill)) {\n        this.autocompleteValue.makeAutofill();\n      }\n    });\n\n    effect(() => {\n      const options = this.optionsResource();\n\n      if (!options) {\n        return;\n      }\n\n      const { onDemand, onServer, inMemory, inMemoryWithLoading } = options;\n\n      if (onDemand) {\n        this.optionList.set(onDemand.value());\n        this.isLoading.set(onDemand.isLoading());\n      } else if (onServer) {\n        this.optionList.set(this.applyFilter(onServer.value()));\n        this.isLoading.set(onServer.isLoading());\n      } else if (inMemory) {\n        this.optionList.set(this.applyFilter(inMemory));\n        this.isLoading.set(false);\n      } else if (inMemoryWithLoading) {\n        const optionsWithLoading = inMemoryWithLoading();\n        this.optionList.set(this.applyFilter(optionsWithLoading ?? []));\n        this.isLoading.set(!optionsWithLoading);\n      }\n    });\n  }\n\n  private applyFilter(options: AutocompleteList) {\n    const filter = this.autocompleteValue.filter() ?? '';\n    return options.filter((option) =>\n      option.label.toLowerCase().includes(filter.toLowerCase())\n    );\n  }\n\n  private generateOptionsResource(): OptionsResource {\n    const options = this.options();\n\n    if (Object.hasOwn(options, 'value')) {\n      return { onServer: options as ResourceRef<AutocompleteList> };\n    } else if (isSignal(options)) {\n      return {\n        inMemoryWithLoading: options as Signal<AutocompleteList>,\n      };\n    } else if (typeof options === 'function') {\n      const resourceFnOptions = options as AutocompleteDataOptionsFn;\n      return {\n        onDemand: runInInjectionContext(this.injector, () =>\n          resourceFnOptions(this.autocompleteValue.requestOptionsParams)\n        ),\n      };\n    }\n\n    return { inMemory: options as AutocompleteList };\n  }\n\n  open() {\n    this.autocomplete.open({\n      fieldId: this.fieldId,\n      options: this.optionList,\n      control: this.control(),\n      multiple: this.multiple(),\n      autocompleteValue: this.autocompleteValue,\n      placeholderSearchField: this.placeholderSearchField(),\n      disableAutoTypeConversion: this.disableAutoTypeConversion(),\n    });\n  }\n\n  ngOnInit(): void {\n    this.autocompleteValue.init(\n      this.control(),\n      this.optionList,\n      this.isLoading,\n      this.isOnDemand,\n      this.multiple()\n    );\n    this.optionsResource.set(this.generateOptionsResource());\n    this.autocompleteValue.makeAutofill();\n  }\n}\n","<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n  [class.has-value]=\"autocompleteValue.hasValue()\"\n  type=\"button\"\n  tabindex=\"0\"\n  [id]=\"fieldId\"\n  [disabled]=\"isDisabled() || isLoading()\"\n  (focus)=\"control().markAsTouched()\"\n  (click)=\"open()\">\n\n  @if (label(); as label) {\n    <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n      <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n    </span>\n  }\n\n  <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n    [hookChange]=\"!isLoading() && (autocompleteValue.filter() || autocompleteValue.currentValue())\"\n    [class.hidden]=\"!autocompleteValue.hasValue()\">\n    @if (multiple()) {\n      @for (item of autocompleteValue.selectedOptions(); track $index) {\n        <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n          <span>{{item.label}}</span>\n          <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n            (click)=\"autocompleteValue.remove($event, item.value)\">\n          </i>\n        </span>\n      }\n    } @else {\n      {{autocompleteValue.selectedOption()?.label}}\n    }\n  </div>\n\n  @if (isLoading()) {\n    <kl-loader size=\"small\" />\n  } @else if (autocompleteValue.hasValue()) {\n    <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n      (click)=\"autocompleteValue.clear($event)\">\n    </i>\n  }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n  <ng-container errors>\n    <ng-content select=\"[errors]\" />\n  </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}