@testgorilla/tgo-ui 7.4.3 → 7.4.4
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-autocomplete-v2.mjs","sources":["../../../components/autocomplete-v2/autocomplete-v2-utils.ts","../../../components/autocomplete-v2/autocomplete-v2-filter.service.ts","../../../components/autocomplete-v2/autocomplete-v2.model.ts","../../../components/autocomplete-v2/autocomplete-v2-value-manager.ts","../../../components/autocomplete-v2/infinite-scroll.directive.ts","../../../components/autocomplete-v2/autocomplete-overflow-detect.directive.ts","../../../components/autocomplete-v2/autocomplete-v2.component.ts","../../../components/autocomplete-v2/autocomplete-v2.component.html","../../../components/autocomplete-v2/testgorilla-tgo-ui-components-autocomplete-v2.ts"],"sourcesContent":["type Item = Record<string, unknown>;\n\nexport class AutocompleteV2Utils {\n static transformDisplayValue<T extends Item>(value: T | null | undefined, textField: string): string {\n return (value?.[textField] as string | undefined) ?? '';\n }\n\n static filterItems<T extends Item>(items: T[], inputValue: string, textField: string): T[] {\n return items.filter(item => {\n const text = item[textField];\n return typeof text === 'string' && text.toLowerCase().includes(inputValue.toLowerCase());\n });\n }\n\n static filterGroupedItems<T extends Item>(\n groups: { groupName: string; items: T[] }[],\n inputValue: string,\n textField: string\n ): { groupName: string; items: T[]; filteredItems: T[] }[] {\n return groups\n .map(group => ({\n ...group,\n filteredItems: AutocompleteV2Utils.filterItems(group.items, inputValue, textField),\n }))\n .filter(group => group.filteredItems.length > 0);\n }\n\n static excludeSuggestions<T extends Item>(items: T[], excludeItems: T[], valueField: string): T[] {\n if (!valueField || !excludeItems.length) return items ?? [];\n return (items ?? []).filter(item => !excludeItems.find(exclude => exclude[valueField] === item[valueField]));\n }\n\n static createValueItem<T extends Item>(value: T | string, textField: string, valueField: string): T {\n if (typeof value === 'string') {\n return { [textField]: value, [valueField]: value } as T;\n }\n return value;\n }\n\n static findDuplicate<T extends Item>(items: T[], selectedValue: T, lookupKey: string): T | undefined {\n return items.find(v => (lookupKey ? v[lookupKey] === selectedValue[lookupKey] : v === selectedValue));\n }\n\n static isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n }\n}\n","import { Injectable, OnDestroy, signal } from '@angular/core';\nimport { BehaviorSubject, map, Observable, ReplaySubject, startWith } from 'rxjs';\nimport { AutocompleteGroup } from './autocomplete-v2.component';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\n\n@Injectable()\nexport class AutocompleteFilterService<T extends Record<string, any> = Record<string, any>> implements OnDestroy {\n // Configuration\n readonly textField = signal('');\n\n // Data sources (fed by component via effects)\n readonly flatItems = signal<T[]>([]);\n readonly groupsList = signal<AutocompleteGroup<T>[]>([]);\n readonly suggestions = signal<T[]>([]);\n\n // Search state\n readonly searchText$ = new BehaviorSubject<string>('');\n readonly userInput$ = new ReplaySubject<string>(1);\n readonly isSearching$: Observable<boolean> = this.searchText$.pipe(map(v => !!v.trim()));\n\n // Dynamic filtering\n private readonly dynamicSource$ = new BehaviorSubject<T[] | null>(null);\n private isDynamicMode = false;\n\n // Filtered results\n filteredItems$: Observable<T[] | null> = this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length) return null;\n return AutocompleteV2Utils.filterItems<T>(this.flatItems(), inputValue, this.textField());\n })\n );\n\n readonly filteredGroupedItems$: Observable<any[] | null> = this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length || !this.groupsList().length) return null;\n return AutocompleteV2Utils.filterGroupedItems<T>(this.groupsList(), inputValue, this.textField());\n })\n );\n\n readonly filteredSuggestions$: Observable<T[] | null> = this.searchText$.pipe(\n map(inputValue =>\n inputValue.length ? AutocompleteV2Utils.filterItems<T>(this.suggestions(), inputValue, this.textField()) : null\n )\n );\n\n search(text: string, minChars: number): void {\n this.userInput$.next(text);\n if (text.length >= minChars) {\n this.searchText$.next(text);\n } else {\n this.searchText$.next('');\n this.userInput$.next('');\n }\n }\n\n clearSearch(): void {\n this.searchText$.next('');\n this.userInput$.next('');\n }\n\n ngOnDestroy(): void {\n this.searchText$.complete();\n this.userInput$.complete();\n this.dynamicSource$.complete();\n }\n\n setDynamicResults(list: T[] | null, loading: boolean): void {\n if ((list !== null || loading) && !this.isDynamicMode) {\n this.isDynamicMode = true;\n this.filteredItems$ = this.dynamicSource$;\n }\n if (list !== null) {\n this.dynamicSource$.next(list);\n } else if (loading) {\n this.dynamicSource$.next([]);\n }\n }\n}\n","export type AutocompleteType = 'single' | 'multi' | 'large';\n\nexport enum Autocomplete {\n SINGLE = 'single',\n MULTI = 'multi',\n LARGE = 'large',\n}\n\nexport enum DropdownVariation {\n AUTOCOMPLETE = 'autocomplete',\n DROPDOWN = 'dropdown',\n}\n\nexport type DropdownVariationType = `${DropdownVariation}`;\n\nexport type AutocompleteSize = 'small' | 'medium';\n","import { computed, Injectable, signal } from '@angular/core';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { Autocomplete, AutocompleteType } from './autocomplete-v2.model';\n\n@Injectable()\nexport class AutocompleteValueManager<T extends Record<string, any> = Record<string, any>> {\n // ── Configuration signals (set by the component via effects) ────────────────\n readonly type = signal<AutocompleteType>('multi');\n readonly textField = signal<string>('');\n readonly valueField = signal<string>('');\n readonly compareWith = signal<((a: T, b: T) => boolean) | undefined>(undefined);\n\n // ── Value signal ─────────────────────────────────────────────────────────────\n readonly value = signal<T | T[] | null>(null);\n\n // ── Derived ──────────────────────────────────────────────────────────────────\n readonly isSingle = computed(() => this.type() === (Autocomplete.SINGLE as AutocompleteType));\n\n readonly displayValue = computed(() => {\n const type = this.type();\n const value = this.value();\n const textField = this.textField();\n const isSingle = type === (Autocomplete.SINGLE as AutocompleteType);\n const isEmpty = !value || (AutocompleteV2Utils.isArray(value) && !value.length);\n\n if (isEmpty) return '';\n\n if (isSingle) {\n const display = AutocompleteV2Utils.isArray(value) ? value[0] : value;\n return AutocompleteV2Utils.transformDisplayValue(display, textField);\n }\n\n // Multi with values — space placeholder (tags are visible instead)\n return ' ';\n });\n\n // ── CVA callbacks ────────────────────────────────────────────────────────────\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChangeFn: (value: T | T[] | null) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouchedFn: () => void = () => {};\n\n registerOnChange(fn: (value: T | T[] | null) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n notifyChange(): void {\n this.onChangeFn(this.value());\n }\n\n markAsTouched(): void {\n this.onTouchedFn();\n }\n\n writeValue(v: T | T[] | null): void {\n if (v == null) {\n this.value.set(this.isSingle() ? null : []);\n } else {\n this.value.set(v);\n }\n }\n\n // ── Selection ─────────────────────────────────────────────────────────────────\n addValue(newValue: T): void {\n if (!this.isSingle() && !this.value()) {\n this.value.set([]);\n }\n\n const compareWith = this.compareWith();\n const currentArray = AutocompleteV2Utils.isArray(this.value()) ? (this.value() as T[]) : [];\n const foundDuplicate = compareWith\n ? currentArray.find((v: T) => compareWith(v, newValue))\n : AutocompleteV2Utils.findDuplicate<T>(currentArray, newValue, this.textField());\n\n if (!this.isSingle()) {\n this.value.set(\n foundDuplicate\n ? currentArray.filter((v: T) => (compareWith ? !compareWith(v, foundDuplicate) : v !== foundDuplicate))\n : [...currentArray, newValue]\n );\n } else {\n this.value.set(newValue);\n }\n }\n\n /**\n * Removes `option` from the value array.\n * Returns the found item (so the caller can deselect the mat-option), or undefined if not found.\n */\n removeValue(option: T): T | undefined {\n const compareWith = this.compareWith();\n const currentValue = AutocompleteV2Utils.isArray(this.value()) ? (this.value() as T[]) : [];\n const foundValue = currentValue.find((v: T) => (compareWith ? compareWith(v, option) : v === option));\n\n if (foundValue) {\n this.value.set(currentValue.filter((v: T) => (compareWith ? !compareWith(v, option) : v !== option)));\n }\n\n return foundValue;\n }\n\n clear(): void {\n this.value.set(AutocompleteV2Utils.isArray(this.value()) ? [] : null);\n }\n}\n","import { DestroyRef, inject, Injectable, OnDestroy } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { filter, map, Subscription, throttleTime } from 'rxjs';\n\n@Injectable()\nexport class InfiniteScrollDirective implements OnDestroy {\n private viewport: CdkVirtualScrollViewport | null = null;\n private scrollSub: Subscription | null = null;\n private destroyRef = inject(DestroyRef);\n\n private scrollListener = (event: Event): void => {\n const target = event.target as Element | null;\n const trigger = this.panelTrigger;\n if (!trigger) return;\n\n const isNotAutocompleteScroll =\n !target?.id?.includes('mat-autocomplete-') &&\n !(target?.parentElement as Element | null)?.id?.includes('mat-autocomplete-') &&\n !target?.classList?.contains('mat-mdc-autocomplete-trigger');\n\n if (trigger.panelOpen && isNotAutocompleteScroll) {\n trigger.closePanel();\n }\n };\n\n enabled = false;\n closeOnScroll = false;\n panelTrigger: MatAutocompleteTrigger | null = null;\n onBottomReached: (() => void) | null = null;\n\n attachViewport(viewport: CdkVirtualScrollViewport | undefined): void {\n this.detachViewport();\n if (!viewport) return;\n this.viewport = viewport;\n\n if (this.enabled) {\n this.scrollSub = viewport\n .elementScrolled()\n .pipe(\n map(() => viewport.measureScrollOffset('bottom')),\n filter(offset => offset < viewport.getViewportSize() * 0.2),\n throttleTime(200),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.onBottomReached?.();\n });\n }\n }\n\n detachViewport(): void {\n this.scrollSub?.unsubscribe();\n this.scrollSub = null;\n this.viewport = null;\n }\n\n scrollToTop(): void {\n if (this.viewport) {\n this.viewport.scrollToIndex(0);\n this.viewport.checkViewportSize();\n }\n }\n\n startCloseOnScroll(): void {\n if (this.closeOnScroll) {\n window.addEventListener('scroll', this.scrollListener, true);\n }\n }\n\n ngOnDestroy(): void {\n this.detachViewport();\n window.removeEventListener('scroll', this.scrollListener, true);\n }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, input, NgZone, OnDestroy, signal } from '@angular/core';\n\n@Directive({\n selector: '[uiAutocompleteOverflowDetect]',\n standalone: true,\n exportAs: 'autocompleteOverflowDetect',\n})\nexport class AutocompleteOverflowDetectDirective implements AfterViewInit, OnDestroy {\n measureContainer = input<HTMLElement | undefined>(undefined);\n itemSelector = input('.value-tag');\n reserveWidth = input(100);\n\n visibleCount = signal(Infinity);\n overflowCount = signal(0);\n hasMeasured = signal(false);\n tagMaxWidth = signal<number | null>(null);\n\n private resizeObserver: ResizeObserver | null = null;\n private rafId: number | null = null;\n private readonly el = inject(ElementRef);\n private readonly ngZone = inject(NgZone);\n\n ngAfterViewInit(): void {\n // Self-measure when the directive enters the DOM (e.g., after @if condition becomes true)\n this.measure();\n }\n\n setupObserver(containerSelector: string): void {\n const parentContainer = (this.el.nativeElement as HTMLElement).closest(containerSelector);\n if (!parentContainer || typeof ResizeObserver === 'undefined') return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => this.measure());\n });\n\n this.resizeObserver.observe(parentContainer);\n }\n\n measure(): void {\n const container = this.measureContainer();\n if (!container) return;\n\n this.rafId = requestAnimationFrame(() => {\n const infix = container.closest('.mat-mdc-form-field-infix') as HTMLElement;\n if (!infix) return; // Can't measure yet — stay hidden until next attempt\n\n const tags: HTMLElement[] = Array.from(container.querySelectorAll(this.itemSelector()));\n if (!tags.length) {\n this.visibleCount.set(Infinity);\n this.hasMeasured.set(true);\n this.overflowCount.set(0);\n return;\n }\n\n // Measure actual icon widths (clear button + chevron) that share the form field space\n const formField = container.closest('mat-form-field') as HTMLElement;\n let iconsWidth = 0;\n if (formField) {\n formField.querySelectorAll('.remove-selected, .arrow-state').forEach((icon: Element) => {\n iconsWidth += icon.getBoundingClientRect().width;\n });\n }\n\n const inputReserve = 48;\n const counterWidth = 52;\n const availableWidth = infix.getBoundingClientRect().width - inputReserve - iconsWidth;\n let totalWidth = 0;\n let visibleCount = tags.length;\n\n for (let i = 0; i < tags.length; i++) {\n totalWidth += tags[i].getBoundingClientRect().width;\n const remainingTags = tags.length - (i + 1);\n const spaceForCounter = remainingTags > 0 ? counterWidth : 0;\n\n if (totalWidth + spaceForCounter > availableWidth && i > 0) {\n visibleCount = i;\n break;\n }\n }\n\n const total = container.querySelectorAll(this.itemSelector()).length;\n const visible = Math.min(visibleCount, total);\n const overflow = Math.max(0, total - visible);\n\n // Compute max width for each tag so wide tags truncate with ellipsis\n // Single tag: full available width. Multiple visible: account for counter width.\n const padding = overflow >= 10 ? 16 : 8;\n this.tagMaxWidth.set(\n visible === 1 ? availableWidth - padding : availableWidth - (overflow > 0 ? counterWidth : 0) - padding\n );\n\n this.visibleCount.set(visibleCount);\n this.hasMeasured.set(true);\n this.overflowCount.set(overflow);\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n }\n}\n","/* eslint-disable no-underscore-dangle */\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n output,\n signal,\n untracked,\n ViewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n MatAutocompleteTrigger,\n} from '@angular/material/autocomplete';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n ApplicationTheme,\n IKeyboardEvent,\n IncludesPipe,\n PreventInputDirective,\n SelectTextDirective,\n TransformItemPipe,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { ValidationErrorModule } from '@testgorilla/tgo-ui/components/validation-error';\nimport { AutocompleteFilterService } from './autocomplete-v2-filter.service';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteValueManager } from './autocomplete-v2-value-manager';\nimport {\n Autocomplete,\n AutocompleteSize,\n AutocompleteType,\n DropdownVariation,\n DropdownVariationType,\n} from './autocomplete-v2.model';\nimport { InfiniteScrollDirective } from './infinite-scroll.directive';\nimport { AutocompleteOverflowDetectDirective } from './autocomplete-overflow-detect.directive';\n\nexport interface AutocompleteGroup<T extends Record<string, any> = Record<string, any>> {\n groupName: string;\n items: T[];\n}\n\n@Component({\n selector: 'ui-autocomplete-v2',\n templateUrl: './autocomplete-v2.component.html',\n styleUrls: ['./autocomplete-v2.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatAutocompleteModule,\n MatChipsModule,\n MatFormFieldModule,\n MatInputModule,\n TagComponentModule,\n IconComponentModule,\n SpinnerComponentModule,\n CdkVirtualScrollViewport,\n CdkVirtualForOf,\n CdkFixedSizeVirtualScroll,\n PreventInputDirective,\n UiTranslatePipe,\n TransformItemPipe,\n IncludesPipe,\n SelectTextDirective,\n AutocompleteOverflowDetectDirective,\n ValidationErrorModule,\n MatTooltipModule,\n ],\n host: {\n '[attr.theme]': 'applicationTheme',\n },\n providers: [AutocompleteValueManager, AutocompleteFilterService, InfiniteScrollDirective],\n})\nexport class AutocompleteV2Component<T extends Record<string, any> = Record<string, any>>\n implements ControlValueAccessor, AfterViewInit, DoCheck, OnDestroy\n{\n // ── Inputs ──────────────────────────────────────────────────────────────────\n itemsList = input<T[]>([]);\n suggestionsList = input<T[]>([]);\n groupsList = input<AutocompleteGroup<T>[]>([]);\n disabled = input(false);\n allowAdd = input(true);\n textField = input('');\n valueField = input('');\n label = input('');\n placeholder = input('');\n type = input<AutocompleteType>('multi');\n minCharactersSearch = input(3);\n variant = input.required<DropdownVariationType>();\n showBottomContent = input(true);\n required = input<boolean | undefined>(undefined);\n virtualScroll = input(false, { transform: booleanAttribute });\n compareWith = input<((a: T, b: T) => boolean) | undefined>(undefined);\n dropdownPanelClass = input('');\n closeOnScroll = input(false);\n size = input<AutocompleteSize>('medium');\n allowUserInput = input(true);\n clearable = input(true);\n maxLength = input<number | undefined>(undefined);\n dynamicFilterLoading = input(false);\n dynamicFilteredList = input<T[] | null>(null);\n infiniteScroll = input(false);\n hasMoreOptionsForInfiniteScroll = input(true);\n itemValue = input<T | T[] | null>(null);\n formErrorConfig = input<Record<string, string>>({});\n errors = input<string[]>([]);\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n selectionChange = output<T | T[]>();\n searchTextChange = output<string>();\n blur = output<void>();\n focus = output<void>();\n scrollViewportBottomReached = output<void>();\n scrollViewportBottomReachedFiltered = output<void>();\n\n // ── ViewChild ───────────────────────────────────────────────────────────────\n @ViewChild('formField') formFieldElement: ElementRef<HTMLElement>;\n @ViewChild('tagContainer') tagContainer: ElementRef<HTMLElement>;\n @ViewChild('measureEl') protected measureElRef?: ElementRef<HTMLElement>;\n @ViewChild('overflow') overflowDir?: AutocompleteOverflowDetectDirective;\n @ViewChild('trigger') autocomplete: MatAutocompleteTrigger;\n @ViewChild(CdkVirtualScrollViewport, { static: false }) set cdkViewport(viewport: CdkVirtualScrollViewport) {\n // Ensure enabled is set before attaching (ViewChild resolves before ngAfterViewInit)\n this.scrollManager.enabled = this.infiniteScroll();\n this.scrollManager.attachViewport(viewport);\n }\n @ViewChild('autocomplete') matAutocomplete: MatAutocomplete;\n @ViewChild('matInput') matInput: ElementRef<HTMLInputElement>;\n\n // ── Injected services ──────────────────────────────────────────────────────\n protected readonly valueManager = inject(AutocompleteValueManager<T>);\n protected readonly filterService = inject(AutocompleteFilterService<T>);\n private readonly scrollManager = inject(InfiniteScrollDirective);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngZone = inject(NgZone);\n public readonly ngControl = inject(NgControl, { optional: true, self: true });\n protected readonly applicationTheme: ApplicationTheme =\n inject<ApplicationTheme>('CANOPYUI_DEFAULT_APPLICATION_THEME' as any, { optional: true }) ?? 'light';\n\n // ── Internal state ──────────────────────────────────────────────────────────\n protected inputValue = signal<string>('');\n protected isInputFocus = signal(false);\n protected autocompleteType = Autocomplete;\n /** Flat list for default (ungrouped) rendering and virtual scroll */\n protected flatItemsList = computed(() => {\n const suggestions = this.suggestionsList();\n const valField = this.valueField();\n const flat = AutocompleteV2Utils.excludeSuggestions<T>(this.itemsList(), suggestions, valField);\n const grouped = this.groupsList().flatMap(g =>\n AutocompleteV2Utils.excludeSuggestions<T>(g.items, suggestions, valField)\n );\n return [...flat, ...grouped];\n });\n\n /** Grouped list — only used when isGrouped is true */\n protected groupedItemsList = computed(() => {\n const suggestions = this.suggestionsList();\n const valField = this.valueField();\n return this.groupsList().map(group => ({\n groupName: group.groupName,\n items: AutocompleteV2Utils.excludeSuggestions<T>(group.items, suggestions, valField),\n }));\n });\n\n protected _isDisabled = signal(false);\n\n protected translationContext = 'AUTOCOMPLETE.';\n protected readonly utils = AutocompleteV2Utils;\n protected keyboardFocused = signal<boolean>(false);\n protected isAlreadyAdded = computed(() => {\n const compareWith = this.compareWith();\n const val = this.valueManager.value();\n const input = this.inputValue();\n if (!input || input === ' ') return false;\n const valArray = AutocompleteV2Utils.isArray(val) ? val : [];\n return !!(compareWith\n ? valArray.find((v: T) => compareWith(v, input as unknown as T))\n : AutocompleteV2Utils.findDuplicate<T>(valArray, input as unknown as T, this.textField()));\n });\n\n protected showClearButton = computed(() => {\n const type = this.type();\n const val = this.valueManager.value();\n\n if (type === (Autocomplete.SINGLE as AutocompleteType)) {\n return this.clearable() && (val?.length || (val ? !!Object.keys(val).length : false));\n }\n return val && val.length > 1;\n });\n\n protected safeErrors = computed(() => this.errors()?.filter(Boolean) ?? []);\n\n private controlInvalid = signal(false);\n\n protected hasError = computed(() => {\n if (this.ngControl) {\n return this.controlInvalid();\n }\n return this.safeErrors().length > 0;\n });\n\n protected hiddenItemsTooltip = computed(() => {\n const value = this.valueManager.value();\n const visibleCount = this.overflowDir?.visibleCount() ?? Infinity;\n if (!AutocompleteV2Utils.isArray(value)) return '';\n const tf = this.textField();\n return value\n .slice(visibleCount)\n .map(item => (tf ? item[tf] : item))\n .join('\\n');\n });\n\n constructor() {\n // Assign valueAccessor manually to avoid circular DI\n // (providing NG_VALUE_ACCESSOR + injecting NgControl creates a cycle)\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n this.filterService.setDynamicResults(this.dynamicFilteredList(), this.dynamicFilterLoading());\n });\n\n effect(() => {\n this._isDisabled.set(this.disabled());\n });\n\n effect(() => this.valueManager.type.set(this.type()));\n effect(() => this.valueManager.textField.set(this.textField()));\n effect(() => this.valueManager.valueField.set(this.valueField()));\n effect(() => this.valueManager.compareWith.set(this.compareWith()));\n\n effect(() => this.filterService.textField.set(this.textField()));\n effect(() => this.filterService.flatItems.set(this.flatItemsList()));\n effect(() => this.filterService.groupsList.set(this.groupsList()));\n effect(() => this.filterService.suggestions.set(this.suggestionsList()));\n\n effect(() => {\n const v = this.itemValue();\n // In CVA mode, writeValue() owns the value — itemValue should not override it\n if (this.ngControl) {\n if (isDevMode() && v !== null) {\n console.warn(\n '[ui-autocomplete-v2] [itemValue] is set alongside a form control. ' + 'Use ngModel or formControl instead.'\n );\n }\n return;\n }\n this.valueManager.value.set(AutocompleteV2Utils.isArray(v) ? v : v ? [v] : []);\n untracked(() => {\n this.inputValue.set(this.valueManager.displayValue());\n });\n this.cdr.markForCheck();\n });\n\n effect(() => {\n this.valueManager.value(); // track value changes\n untracked(() => {\n if (this.type() !== (Autocomplete.LARGE as AutocompleteType)) {\n this.overflowDir?.measure();\n }\n });\n });\n }\n\n /**\n * Used to mark component view as dirty when touched programmatically with markAsTouched/markAllAsTouched or errors\n * to display validation errors that might happen (e.g. required)\n */\n\n ngDoCheck(): void {\n if (this.ngControl) {\n const invalid = !!(this.ngControl.invalid && this.ngControl.touched);\n if (this.controlInvalid() !== invalid) {\n this.controlInvalid.set(invalid);\n }\n if (this.ngControl.touched || this.ngControl.errors) {\n this.cdr.markForCheck();\n }\n }\n }\n\n ngAfterViewInit(): void {\n // Set default hover color for the autocomplete panel (overlay is outside component scope)\n if (!document.body.style.getPropertyValue('--ui-autocomplete-option-color')) {\n document.body.style.setProperty('--ui-autocomplete-option-color', '#FFF2FC');\n }\n\n if (this.type() !== (Autocomplete.LARGE as AutocompleteType)) {\n this.overflowDir?.setupObserver('.input-container');\n }\n\n this.scrollManager.enabled = this.infiniteScroll();\n this.scrollManager.closeOnScroll = this.closeOnScroll();\n this.scrollManager.panelTrigger = this.autocomplete;\n this.scrollManager.onBottomReached = () => this.onScrollBottom();\n this.scrollManager.startCloseOnScroll();\n\n this.focusMonitor\n .monitor(this.matInput)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin =>\n this.ngZone.run(() => {\n this.keyboardFocused.set(origin === 'keyboard');\n })\n );\n\n this.matInput.nativeElement.onkeydown = this.onKeydown.bind(this);\n }\n\n ngOnDestroy(): void {\n this.scrollManager.ngOnDestroy();\n this.focusMonitor.stopMonitoring(this.matInput);\n if (this.matInput?.nativeElement) {\n this.matInput.nativeElement.onkeydown = null;\n }\n }\n\n registerOnChange(fn: any): void {\n this.valueManager.registerOnChange(fn);\n }\n\n registerOnTouched(fn: any): void {\n this.valueManager.registerOnTouched(fn);\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n this.cdr.markForCheck();\n }\n\n writeValue(value: T | T[] | null): void {\n this.valueManager.writeValue(value);\n this.inputValue.set(this.valueManager.displayValue());\n this.cdr.markForCheck();\n }\n\n protected get isGrouped(): boolean {\n return this.groupsList().length > 0;\n }\n\n protected onOptionSelected(event: MatAutocompleteSelectedEvent): void {\n const inputValue = event.option.value as T;\n const itemValue = AutocompleteV2Utils.createValueItem<T>(inputValue, this.textField(), this.valueField());\n this.valueManager.addValue(itemValue);\n\n queueMicrotask(() => {\n if (this.type() !== (this.autocompleteType.SINGLE as AutocompleteType)) {\n // Multi: clear input so tags are visible while focused\n this.inputValue.set('');\n } else {\n this.inputValue.set(this.valueManager.displayValue());\n }\n this.cdr.markForCheck();\n });\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n protected onOptionRemoved(option: T): void {\n setTimeout(() => this.autocomplete.closePanel(), 0);\n const foundValue = this.valueManager.removeValue(option);\n\n if (foundValue) {\n this.matAutocomplete.options.forEach(matOption => {\n const vf = this.valueField();\n if (vf && matOption.value?.[vf] === foundValue[vf]) {\n matOption.deselect();\n }\n });\n }\n\n if (!this.valueManager.value()?.length) {\n this.inputValue.set('');\n }\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n protected onInputChange(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.filterService.search(text, this.minCharactersSearch());\n if (text.length >= this.minCharactersSearch()) {\n this.searchTextChange.emit(text);\n }\n }\n\n protected onClear(): void {\n this.inputValue.set('');\n this.valueManager.clear();\n this.onUpdate();\n this.matAutocomplete?.options.forEach(option => option.deselect());\n this.valueManager.markAsTouched();\n }\n\n protected onBlur(): void {\n setTimeout(() => {\n this.filterService.clearSearch();\n this.isInputFocus.set(false);\n this.inputValue.set(this.valueManager.displayValue());\n this.valueManager.markAsTouched();\n this.blur.emit();\n this.cdr.markForCheck();\n }, 0);\n }\n\n protected onPanelOpened(): void {\n this.scrollManager.scrollToTop();\n }\n\n protected onScrollBottom(): void {\n if (this.filterService.searchText$.value) {\n this.scrollViewportBottomReachedFiltered.emit();\n } else {\n this.scrollViewportBottomReached.emit();\n }\n }\n\n protected onFocus(): void {\n this.isInputFocus.set(true);\n const val = this.inputValue();\n if (typeof val === 'string' && val.match(/^\\s+/gm)) {\n this.inputValue.set(val.trimStart());\n }\n this.focus.emit();\n }\n\n private onUpdate(): void {\n this.filterService.clearSearch();\n this.valueManager.notifyChange();\n const val = this.valueManager.value();\n if (val !== null) {\n this.selectionChange.emit(val);\n }\n }\n\n protected get isDropdown(): boolean {\n return this.variant() === (DropdownVariation.DROPDOWN as DropdownVariationType);\n }\n\n protected onChevronClick(autocomplete: MatAutocomplete): void {\n if (autocomplete.isOpen) {\n setTimeout(() => {\n this.autocomplete.closePanel();\n }, 0);\n }\n }\n\n protected trackByFn = (index: number, value: string) => value;\n\n protected trackByItem = (_index: number, item: T) => {\n const vf = this.valueField();\n return vf ? item?.[vf] : item;\n };\n\n onKeydown($event: KeyboardEvent) {\n const optionHeight = 48;\n\n if ($event.key === (IKeyboardEvent.HOME as string)) {\n this.matAutocomplete._keyManager.setFirstItemActive();\n } else if ($event.key === (IKeyboardEvent.END as string)) {\n this.matAutocomplete._keyManager.setLastItemActive();\n } else if ($event.key === (IKeyboardEvent.PAGE_DOWN as string)) {\n this.matAutocomplete._keyManager.setNextItemActive();\n this.matAutocomplete._keyManager.setNextItemActive();\n this.matAutocomplete._keyManager.setNextItemActive();\n } else if ($event.key === (IKeyboardEvent.PAGE_UP as string)) {\n this.matAutocomplete._keyManager.setPreviousItemActive();\n this.matAutocomplete._keyManager.setPreviousItemActive();\n this.matAutocomplete._keyManager.setPreviousItemActive();\n }\n\n this.matAutocomplete._setScrollTop((this.matAutocomplete._keyManager.activeItemIndex ?? 0) * optionHeight);\n }\n\n protected getVirtualScrollHeight(itemCount: number): number {\n const itemHeight = 48;\n const maxHeight = 200;\n const minHeight = 48;\n\n const calculatedHeight = itemCount * itemHeight;\n\n return Math.min(Math.max(calculatedHeight, minHeight), maxHeight);\n }\n}\n","<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ disabled: _isDisabled() }\">\n <mat-form-field\n [color]=\"hasError() ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{\n 'large-size': type() === autocompleteType.LARGE,\n 'hide-bottom-content': !showBottomContent(),\n 'keyboard-focused': keyboardFocused(),\n 'has-label': !!label(),\n }\"\n >\n @if (label()) {\n <mat-label\n >{{ label() }}\n @if (required()) {\n <span>*</span>\n }\n </mat-label>\n }\n <div #formField class=\"input-container\">\n @if (textField() ? $any(valueManager.value())?.[textField()] : $any(valueManager.value()) === inputValue()) {\n <span style=\"position: absolute; left: -9999px\" aria-live=\"polite\">{{\n ('SELECTED' | uiTranslate | async) + ' ' + inputValue()\n }}</span>\n }\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [attr.maxlength]=\"maxLength() !== null && maxLength() !== undefined ? maxLength() : null\"\n [uiPreventInput]=\"!allowUserInput()\"\n [disabled]=\"_isDisabled()\"\n [ngClass]=\"{\n 'unset-margin': valueManager.value() && type() === autocompleteType.LARGE,\n 'no-caret': !allowUserInput(),\n }\"\n (blur)=\"onBlur()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"\n (translationContext + 'SELECTED' | uiTranslate | async) +\n ' ' +\n (valueManager.value() | transformItem: textField() : true)\n \"\n matInput\n [placeholder]=\"valueManager.value() && valueManager.value()!.length ? '' : placeholder()\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [ngModel]=\"inputValue()\"\n (ngModelChange)=\"inputValue.set($event)\"\n />\n <!-- Hidden measurement container: always in DOM, renders ALL tags for width measurement -->\n @if (type() !== autocompleteType.SINGLE && utils.isArray(valueManager.value())) {\n <div class=\"selected-items measurement-container\" #measureEl>\n @for (valueItem of $any(valueManager.value()); track valueItem; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'measure-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-tag>\n }\n </div>\n }\n\n @if (\n (type() === autocompleteType.LARGE && valueManager.value()) ||\n (!(inputValue() && isInputFocus()) && valueManager.value() && type() !== autocompleteType.SINGLE)\n ) {\n <!-- Visible container: only renders tags that fit. Hidden until first measurement to prevent flash. -->\n <div\n class=\"selected-items\"\n #tagContainer\n uiAutocompleteOverflowDetect\n #overflow=\"autocompleteOverflowDetect\"\n [measureContainer]=\"measureElRef?.nativeElement\"\n [class.measured]=\"\n type() === autocompleteType.LARGE || type() === autocompleteType.SINGLE || overflow.hasMeasured()\n \"\n >\n @if (size() === 'small' && valueManager.value()!.length > 1) {\n <div class=\"selected-count\">\n {{\n translationContext + 'SELECTED_AMOUNT'\n | uiTranslate: { numberSelected: valueManager.value()!.length }\n | async\n }}\n </div>\n } @else {\n @for (valueItem of $any(valueManager.value()); track valueItem; let i = $index) {\n @if (i < overflow.visibleCount()) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [ngStyle]=\"\n type() !== autocompleteType.LARGE\n ? { '--tag-max-width': overflow.tagMaxWidth() ? overflow.tagMaxWidth() + 'px' : 'fit-content' }\n : {}\n \"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n }\n }\n @if (overflow.overflowCount() > 0) {\n <div class=\"overlap-count\" [matTooltip]=\"hiddenItemsTooltip()\">\n <ui-tag [applicationTheme]=\"applicationTheme\" [label]=\"'+' + overflow.overflowCount()\"></ui-tag>\n </div>\n }\n }\n </div>\n }\n </div>\n\n @if (showClearButton()) {\n <ui-icon\n class=\"remove-selected\"\n [tabIndex]=\"_isDisabled() ? -1 : 0\"\n (keydown.enter)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n (keydown.space)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type() === autocompleteType.LARGE }\"\n (click)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"'COMMON.CLEAR' | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n }\n\n @if (isDropdown) {\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type() === autocompleteType.LARGE }\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n }\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass()\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"onPanelOpened()\"\n >\n <!-- Reusable option template — must be inside mat-autocomplete for @ContentChildren to find mat-options -->\n <ng-template #optionTpl let-item=\"item\" let-highlight=\"highlight\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"highlight ? (filterService.userInput$ | async) : null\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </ng-template>\n\n <!-- ── Unfiltered ───────────────────────────────────────────────── -->\n @if ((filterService.isSearching$ | async) === false) {\n @if (!isDropdown) {\n <!-- Suggestions -->\n @if (suggestionsList().length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n @for (suggested of suggestionsList(); track suggested) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: suggested, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Selected items (multi) -->\n @if (valueManager.value()?.length && type() !== autocompleteType.SINGLE) {\n <mat-optgroup [label]=\"(translationContext + 'SELECTED' | uiTranslate | async)! | uppercase\">\n @for (item of $any(valueManager.value()); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: false }\"></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Main items (normalized groups) -->\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(flatItemsList().length)\"\n class=\"virtual-scroll\"\n >\n @if (!isGrouped) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of flatItemsList(); trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n } @else {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n\n @if (infiniteScroll() && hasMoreOptionsForInfiniteScroll()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (isGrouped) {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n } @else {\n @for (item of flatItemsList(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n }\n }\n\n <!-- Selected item (single) -->\n @if (valueManager.value()?.length && type() === autocompleteType.SINGLE) {\n <mat-optgroup [label]=\"(translationContext + 'SELECTED' | uiTranslate | async)! | uppercase\">\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: valueManager.value(), highlight: true }\"\n ></ng-container>\n </mat-optgroup>\n }\n } @else {\n <!-- ── Dropdown (unfiltered) ────────────────────────────────── -->\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(flatItemsList().length)\"\n class=\"virtual-scroll\"\n >\n @if (!isGrouped) {\n <!-- Ungrouped: flat cdkVirtualFor directly in viewport -->\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of flatItemsList(); trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n } @else {\n <!-- Grouped: nested cdkVirtualFor per group -->\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n\n @if (infiniteScroll() && hasMoreOptionsForInfiniteScroll()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (isGrouped) {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n } @else {\n @for (item of flatItemsList(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n }\n }\n }\n }\n\n <!-- ── Filtered ────────────────────────────────────────────────── -->\n @if (filterService.filteredSuggestions$ | async; as filteredSuggestionList) {\n @if (filterService.filteredItems$ | async; as filteredItemsList) {\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(filteredItemsList.length)\"\n class=\"virtual-scroll\"\n >\n <!-- Filtered suggestions -->\n @if (filteredSuggestionList.length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of filteredSuggestionList; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n }\n\n <!-- Filtered items: grouped -->\n @if (isGrouped && (filterService.filteredGroupedItems$ | async); as filteredGroups) {\n @if (filteredGroups.length) {\n @for (group of filteredGroups; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.filteredItems; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.filteredItems; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n }\n\n <!-- Filtered items: ungrouped (no suggestions) -->\n @if (!filteredSuggestionList.length && !isGrouped) {\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n } @else {\n <!-- Filtered items: ungrouped with suggestions present (ALL_ITEMS group) -->\n @if (filteredItemsList.length && !isGrouped) {\n <mat-optgroup [label]=\"(translationContext + 'ALL_ITEMS' | uiTranslate | async)! | uppercase\">\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (dynamicFilterLoading()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if (inputValue()) {\n @if (allowAdd() && !isAlreadyAdded()) {\n <mat-option (mousedown)=\"$event.preventDefault()\" [value]=\"inputValue()\">\n <span>{{ 'COMMON.ADD' | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue() }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n <!-- Filtered items: grouped -->\n @if (isGrouped && (filterService.filteredGroupedItems$ | async); as filteredGroups) {\n @if (filteredGroups.length) {\n @for (group of filteredGroups; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.filteredItems; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.filteredItems; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n }\n }\n\n <!-- Filtered suggestions -->\n @if (filteredSuggestionList.length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n @for (item of filteredSuggestionList; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Filtered items: ungrouped (no suggestions) -->\n @if (!filteredSuggestionList.length && !isGrouped) {\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n } @else {\n <!-- Filtered items: ungrouped with suggestions present (ALL_ITEMS group) -->\n @if (filteredItemsList.length && !isGrouped) {\n <mat-optgroup [label]=\"(translationContext + 'ALL_ITEMS' | uiTranslate | async)! | uppercase\">\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (dynamicFilterLoading()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if (inputValue()) {\n @if (allowAdd() && !isAlreadyAdded()) {\n <mat-option (mousedown)=\"$event.preventDefault()\" [value]=\"inputValue()\">\n <span>{{ 'COMMON.ADD' | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue() }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n }\n }\n }\n </mat-autocomplete>\n @if (hasError()) {\n <mat-hint class=\"error\">\n @if (ngControl) {\n <ui-validation-error\n [ngControl]=\"ngControl\"\n [customErrors]=\"formErrorConfig()\"\n [label]=\"label()\"\n ></ui-validation-error>\n } @else {\n @for (error of safeErrors(); track error) {\n <div class=\"errors\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ error }}</span>\n </div>\n }\n }\n </mat-hint>\n }\n </mat-form-field>\n </div>\n</ng-container>\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":"testgorilla-tgo-ui-components-autocomplete-v2.mjs","sources":["../../../components/autocomplete-v2/autocomplete-v2-utils.ts","../../../components/autocomplete-v2/autocomplete-v2-filter.service.ts","../../../components/autocomplete-v2/autocomplete-v2.model.ts","../../../components/autocomplete-v2/autocomplete-v2-value-manager.ts","../../../components/autocomplete-v2/infinite-scroll.directive.ts","../../../components/autocomplete-v2/autocomplete-overflow-detect.directive.ts","../../../components/autocomplete-v2/autocomplete-v2.component.ts","../../../components/autocomplete-v2/autocomplete-v2.component.html","../../../components/autocomplete-v2/testgorilla-tgo-ui-components-autocomplete-v2.ts"],"sourcesContent":["type Item = Record<string, unknown>;\n\nexport class AutocompleteV2Utils {\n static transformDisplayValue<T extends Item>(value: T | null | undefined, textField: string): string {\n return (value?.[textField] as string | undefined) ?? '';\n }\n\n static filterItems<T extends Item>(items: T[], inputValue: string, textField: string): T[] {\n return items.filter(item => {\n const text = item[textField];\n return typeof text === 'string' && text.toLowerCase().includes(inputValue.toLowerCase());\n });\n }\n\n static filterGroupedItems<T extends Item>(\n groups: { groupName: string; items: T[] }[],\n inputValue: string,\n textField: string\n ): { groupName: string; items: T[]; filteredItems: T[] }[] {\n return groups\n .map(group => ({\n ...group,\n filteredItems: AutocompleteV2Utils.filterItems(group.items, inputValue, textField),\n }))\n .filter(group => group.filteredItems.length > 0);\n }\n\n static excludeSuggestions<T extends Item>(items: T[], excludeItems: T[], valueField: string): T[] {\n if (!valueField || !excludeItems.length) return items ?? [];\n return (items ?? []).filter(item => !excludeItems.find(exclude => exclude[valueField] === item[valueField]));\n }\n\n static createValueItem<T extends Item>(value: T | string, textField: string, valueField: string): T {\n if (typeof value === 'string') {\n return { [textField]: value, [valueField]: value } as T;\n }\n return value;\n }\n\n static findDuplicate<T extends Item>(items: T[], selectedValue: T, lookupKey: string): T | undefined {\n return items.find(v => (lookupKey ? v[lookupKey] === selectedValue[lookupKey] : v === selectedValue));\n }\n\n static isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n }\n}\n","import { Injectable, OnDestroy, signal } from '@angular/core';\nimport { BehaviorSubject, map, Observable, ReplaySubject, startWith } from 'rxjs';\nimport { AutocompleteGroup } from './autocomplete-v2.component';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\n\n@Injectable()\nexport class AutocompleteFilterService<T extends Record<string, any> = Record<string, any>> implements OnDestroy {\n // Configuration\n readonly textField = signal('');\n\n // Data sources (fed by component via effects)\n readonly flatItems = signal<T[]>([]);\n readonly groupsList = signal<AutocompleteGroup<T>[]>([]);\n readonly suggestions = signal<T[]>([]);\n\n // Search state\n readonly searchText$ = new BehaviorSubject<string>('');\n readonly userInput$ = new ReplaySubject<string>(1);\n readonly isSearching$: Observable<boolean> = this.searchText$.pipe(map(v => !!v.trim()));\n\n // Dynamic filtering\n private readonly dynamicSource$ = new BehaviorSubject<T[] | null>(null);\n private isDynamicMode = false;\n\n // Filtered results\n filteredItems$: Observable<T[] | null> = this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length) return null;\n return AutocompleteV2Utils.filterItems<T>(this.flatItems(), inputValue, this.textField());\n })\n );\n\n readonly filteredGroupedItems$: Observable<any[] | null> = this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length || !this.groupsList().length) return null;\n return AutocompleteV2Utils.filterGroupedItems<T>(this.groupsList(), inputValue, this.textField());\n })\n );\n\n readonly filteredSuggestions$: Observable<T[] | null> = this.searchText$.pipe(\n map(inputValue =>\n inputValue.length ? AutocompleteV2Utils.filterItems<T>(this.suggestions(), inputValue, this.textField()) : null\n )\n );\n\n search(text: string, minChars: number): void {\n this.userInput$.next(text);\n if (text.length >= minChars) {\n this.searchText$.next(text);\n } else {\n this.searchText$.next('');\n this.userInput$.next('');\n }\n }\n\n clearSearch(): void {\n this.searchText$.next('');\n this.userInput$.next('');\n }\n\n ngOnDestroy(): void {\n this.searchText$.complete();\n this.userInput$.complete();\n this.dynamicSource$.complete();\n }\n\n setDynamicResults(list: T[] | null, loading: boolean): void {\n if ((list !== null || loading) && !this.isDynamicMode) {\n this.isDynamicMode = true;\n this.filteredItems$ = this.dynamicSource$;\n }\n if (list !== null) {\n this.dynamicSource$.next(list);\n } else if (loading) {\n this.dynamicSource$.next([]);\n }\n }\n}\n","export type AutocompleteType = 'single' | 'multi' | 'large';\n\nexport enum Autocomplete {\n SINGLE = 'single',\n MULTI = 'multi',\n LARGE = 'large',\n}\n\nexport enum DropdownVariation {\n AUTOCOMPLETE = 'autocomplete',\n DROPDOWN = 'dropdown',\n}\n\nexport type DropdownVariationType = `${DropdownVariation}`;\n\nexport type AutocompleteSize = 'small' | 'medium';\n","import { computed, Injectable, signal } from '@angular/core';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { Autocomplete, AutocompleteType } from './autocomplete-v2.model';\n\n@Injectable()\nexport class AutocompleteValueManager<T extends Record<string, any> = Record<string, any>> {\n // ── Configuration signals (set by the component via effects) ────────────────\n readonly type = signal<AutocompleteType>('multi');\n readonly textField = signal<string>('');\n readonly valueField = signal<string>('');\n readonly compareWith = signal<((a: T, b: T) => boolean) | undefined>(undefined);\n\n // ── Value signal ─────────────────────────────────────────────────────────────\n readonly value = signal<T | T[] | null>(null);\n\n // ── Derived ──────────────────────────────────────────────────────────────────\n readonly isSingle = computed(() => this.type() === (Autocomplete.SINGLE as AutocompleteType));\n\n readonly displayValue = computed(() => {\n const type = this.type();\n const value = this.value();\n const textField = this.textField();\n const isSingle = type === (Autocomplete.SINGLE as AutocompleteType);\n const isEmpty = !value || (AutocompleteV2Utils.isArray(value) && !value.length);\n\n if (isEmpty) return '';\n\n if (isSingle) {\n const display = AutocompleteV2Utils.isArray(value) ? value[0] : value;\n return AutocompleteV2Utils.transformDisplayValue(display, textField);\n }\n\n // Multi with values — space placeholder (tags are visible instead)\n return ' ';\n });\n\n // ── CVA callbacks ────────────────────────────────────────────────────────────\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChangeFn: (value: T | T[] | null) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouchedFn: () => void = () => {};\n\n registerOnChange(fn: (value: T | T[] | null) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n notifyChange(): void {\n this.onChangeFn(this.value());\n }\n\n markAsTouched(): void {\n this.onTouchedFn();\n }\n\n writeValue(v: T | T[] | null): void {\n if (v == null) {\n this.value.set(this.isSingle() ? null : []);\n } else {\n this.value.set(v);\n }\n }\n\n // ── Selection ─────────────────────────────────────────────────────────────────\n addValue(newValue: T): void {\n if (!this.isSingle() && !this.value()) {\n this.value.set([]);\n }\n\n const compareWith = this.compareWith();\n const currentArray = AutocompleteV2Utils.isArray(this.value()) ? (this.value() as T[]) : [];\n const foundDuplicate = compareWith\n ? currentArray.find((v: T) => compareWith(v, newValue))\n : AutocompleteV2Utils.findDuplicate<T>(currentArray, newValue, this.textField());\n\n if (!this.isSingle()) {\n this.value.set(\n foundDuplicate\n ? currentArray.filter((v: T) => (compareWith ? !compareWith(v, foundDuplicate) : v !== foundDuplicate))\n : [...currentArray, newValue]\n );\n } else {\n this.value.set(newValue);\n }\n }\n\n /**\n * Removes `option` from the value array.\n * Returns the found item (so the caller can deselect the mat-option), or undefined if not found.\n */\n removeValue(option: T): T | undefined {\n const compareWith = this.compareWith();\n const currentValue = AutocompleteV2Utils.isArray(this.value()) ? (this.value() as T[]) : [];\n const foundValue = currentValue.find((v: T) => (compareWith ? compareWith(v, option) : v === option));\n\n if (foundValue) {\n this.value.set(currentValue.filter((v: T) => (compareWith ? !compareWith(v, option) : v !== option)));\n }\n\n return foundValue;\n }\n\n clear(): void {\n this.value.set(AutocompleteV2Utils.isArray(this.value()) ? [] : null);\n }\n}\n","import { DestroyRef, inject, Injectable, OnDestroy } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { filter, map, Subscription, throttleTime } from 'rxjs';\n\n@Injectable()\nexport class InfiniteScrollDirective implements OnDestroy {\n private viewport: CdkVirtualScrollViewport | null = null;\n private scrollSub: Subscription | null = null;\n private destroyRef = inject(DestroyRef);\n\n private scrollListener = (event: Event): void => {\n const target = event.target as Element | null;\n const trigger = this.panelTrigger;\n if (!trigger) return;\n\n const isNotAutocompleteScroll =\n !target?.id?.includes('mat-autocomplete-') &&\n !(target?.parentElement as Element | null)?.id?.includes('mat-autocomplete-') &&\n !target?.classList?.contains('mat-mdc-autocomplete-trigger');\n\n if (trigger.panelOpen && isNotAutocompleteScroll) {\n trigger.closePanel();\n }\n };\n\n enabled = false;\n closeOnScroll = false;\n panelTrigger: MatAutocompleteTrigger | null = null;\n onBottomReached: (() => void) | null = null;\n\n attachViewport(viewport: CdkVirtualScrollViewport | undefined): void {\n this.detachViewport();\n if (!viewport) return;\n this.viewport = viewport;\n\n if (this.enabled) {\n this.scrollSub = viewport\n .elementScrolled()\n .pipe(\n map(() => viewport.measureScrollOffset('bottom')),\n filter(offset => offset < viewport.getViewportSize() * 0.2),\n throttleTime(200),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.onBottomReached?.();\n });\n }\n }\n\n detachViewport(): void {\n this.scrollSub?.unsubscribe();\n this.scrollSub = null;\n this.viewport = null;\n }\n\n scrollToTop(): void {\n if (this.viewport) {\n this.viewport.scrollToIndex(0);\n this.viewport.checkViewportSize();\n }\n }\n\n startCloseOnScroll(): void {\n if (this.closeOnScroll) {\n window.addEventListener('scroll', this.scrollListener, true);\n }\n }\n\n ngOnDestroy(): void {\n this.detachViewport();\n window.removeEventListener('scroll', this.scrollListener, true);\n }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, input, NgZone, OnDestroy, signal } from '@angular/core';\n\n@Directive({\n selector: '[uiAutocompleteOverflowDetect]',\n standalone: true,\n exportAs: 'autocompleteOverflowDetect',\n})\nexport class AutocompleteOverflowDetectDirective implements AfterViewInit, OnDestroy {\n measureContainer = input<HTMLElement | undefined>(undefined);\n itemSelector = input('.value-tag');\n reserveWidth = input(100);\n\n visibleCount = signal(Infinity);\n overflowCount = signal(0);\n hasMeasured = signal(false);\n tagMaxWidth = signal<number | null>(null);\n\n private resizeObserver: ResizeObserver | null = null;\n private rafId: number | null = null;\n private readonly el = inject(ElementRef);\n private readonly ngZone = inject(NgZone);\n\n ngAfterViewInit(): void {\n // Self-measure when the directive enters the DOM (e.g., after @if condition becomes true)\n this.measure();\n }\n\n setupObserver(containerSelector: string): void {\n const parentContainer = (this.el.nativeElement as HTMLElement).closest(containerSelector);\n if (!parentContainer || typeof ResizeObserver === 'undefined') return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => this.measure());\n });\n\n this.resizeObserver.observe(parentContainer);\n }\n\n measure(): void {\n const container = this.measureContainer();\n if (!container) return;\n\n this.rafId = requestAnimationFrame(() => {\n const infix = container.closest('.mat-mdc-form-field-infix') as HTMLElement;\n if (!infix) return; // Can't measure yet — stay hidden until next attempt\n\n const tags: HTMLElement[] = Array.from(container.querySelectorAll(this.itemSelector()));\n if (!tags.length) {\n this.visibleCount.set(Infinity);\n this.hasMeasured.set(true);\n this.overflowCount.set(0);\n return;\n }\n\n // Measure actual icon widths (clear button + chevron) that share the form field space\n const formField = container.closest('mat-form-field') as HTMLElement;\n let iconsWidth = 0;\n if (formField) {\n formField.querySelectorAll('.remove-selected, .arrow-state').forEach((icon: Element) => {\n iconsWidth += icon.getBoundingClientRect().width;\n });\n }\n\n const inputReserve = 48;\n const counterWidth = 52;\n const availableWidth = infix.getBoundingClientRect().width - inputReserve - iconsWidth;\n let totalWidth = 0;\n let visibleCount = tags.length;\n\n for (let i = 0; i < tags.length; i++) {\n totalWidth += tags[i].getBoundingClientRect().width;\n const remainingTags = tags.length - (i + 1);\n const spaceForCounter = remainingTags > 0 ? counterWidth : 0;\n\n if (totalWidth + spaceForCounter > availableWidth && i > 0) {\n visibleCount = i;\n break;\n }\n }\n\n const total = container.querySelectorAll(this.itemSelector()).length;\n const visible = Math.min(visibleCount, total);\n const overflow = Math.max(0, total - visible);\n\n // Compute max width for each tag so wide tags truncate with ellipsis\n // Single tag: full available width. Multiple visible: account for counter width.\n const padding = overflow >= 10 ? 16 : 8;\n this.tagMaxWidth.set(\n visible === 1 ? availableWidth - padding : availableWidth - (overflow > 0 ? counterWidth : 0) - padding\n );\n\n this.visibleCount.set(visibleCount);\n this.hasMeasured.set(true);\n this.overflowCount.set(overflow);\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n }\n}\n","/* eslint-disable no-underscore-dangle */\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n output,\n signal,\n untracked,\n ViewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n MatAutocompleteTrigger,\n} from '@angular/material/autocomplete';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n ApplicationTheme,\n IKeyboardEvent,\n IncludesPipe,\n PreventInputDirective,\n SelectTextDirective,\n TransformItemPipe,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { ValidationErrorModule } from '@testgorilla/tgo-ui/components/validation-error';\nimport { AutocompleteFilterService } from './autocomplete-v2-filter.service';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteValueManager } from './autocomplete-v2-value-manager';\nimport {\n Autocomplete,\n AutocompleteSize,\n AutocompleteType,\n DropdownVariation,\n DropdownVariationType,\n} from './autocomplete-v2.model';\nimport { InfiniteScrollDirective } from './infinite-scroll.directive';\nimport { AutocompleteOverflowDetectDirective } from './autocomplete-overflow-detect.directive';\n\nexport interface AutocompleteGroup<T extends Record<string, any> = Record<string, any>> {\n groupName: string;\n items: T[];\n}\n\n@Component({\n selector: 'ui-autocomplete-v2',\n templateUrl: './autocomplete-v2.component.html',\n styleUrls: ['./autocomplete-v2.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatAutocompleteModule,\n MatChipsModule,\n MatFormFieldModule,\n MatInputModule,\n TagComponentModule,\n IconComponentModule,\n SpinnerComponentModule,\n CdkVirtualScrollViewport,\n CdkVirtualForOf,\n CdkFixedSizeVirtualScroll,\n PreventInputDirective,\n UiTranslatePipe,\n TransformItemPipe,\n IncludesPipe,\n SelectTextDirective,\n AutocompleteOverflowDetectDirective,\n ValidationErrorModule,\n MatTooltipModule,\n ],\n host: {\n '[attr.theme]': 'applicationTheme',\n },\n providers: [AutocompleteValueManager, AutocompleteFilterService, InfiniteScrollDirective],\n})\nexport class AutocompleteV2Component<T extends Record<string, any> = Record<string, any>>\n implements ControlValueAccessor, AfterViewInit, DoCheck, OnDestroy\n{\n // ── Inputs ──────────────────────────────────────────────────────────────────\n itemsList = input<T[]>([]);\n suggestionsList = input<T[]>([]);\n groupsList = input<AutocompleteGroup<T>[]>([]);\n disabled = input(false);\n allowAdd = input(true);\n textField = input('');\n valueField = input('');\n label = input('');\n placeholder = input('');\n type = input<AutocompleteType>('multi');\n minCharactersSearch = input(3);\n variant = input.required<DropdownVariationType>();\n showBottomContent = input(true);\n required = input<boolean | undefined>(undefined);\n virtualScroll = input(false, { transform: booleanAttribute });\n compareWith = input<((a: T, b: T) => boolean) | undefined>(undefined);\n dropdownPanelClass = input('');\n closeOnScroll = input(false);\n size = input<AutocompleteSize>('medium');\n allowUserInput = input(true);\n clearable = input(true);\n maxLength = input<number | undefined>(undefined);\n dynamicFilterLoading = input(false);\n dynamicFilteredList = input<T[] | null>(null);\n infiniteScroll = input(false);\n hasMoreOptionsForInfiniteScroll = input(true);\n itemValue = input<T | T[] | null>(null);\n formErrorConfig = input<Record<string, string>>({});\n errors = input<string[]>([]);\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n selectionChange = output<T | T[]>();\n searchTextChange = output<string>();\n blur = output<void>();\n focus = output<void>();\n scrollViewportBottomReached = output<void>();\n scrollViewportBottomReachedFiltered = output<void>();\n\n // ── ViewChild ───────────────────────────────────────────────────────────────\n @ViewChild('formField') formFieldElement: ElementRef<HTMLElement>;\n @ViewChild('tagContainer') tagContainer: ElementRef<HTMLElement>;\n @ViewChild('measureEl') protected measureElRef?: ElementRef<HTMLElement>;\n @ViewChild('overflow') overflowDir?: AutocompleteOverflowDetectDirective;\n @ViewChild('trigger') autocomplete: MatAutocompleteTrigger;\n @ViewChild(CdkVirtualScrollViewport, { static: false }) set cdkViewport(viewport: CdkVirtualScrollViewport) {\n // Ensure enabled is set before attaching (ViewChild resolves before ngAfterViewInit)\n this.scrollManager.enabled = this.infiniteScroll();\n this.scrollManager.attachViewport(viewport);\n }\n @ViewChild('autocomplete') matAutocomplete: MatAutocomplete;\n @ViewChild('matInput') matInput: ElementRef<HTMLInputElement>;\n\n // ── Injected services ──────────────────────────────────────────────────────\n protected readonly valueManager = inject(AutocompleteValueManager<T>);\n protected readonly filterService = inject(AutocompleteFilterService<T>);\n private readonly scrollManager = inject(InfiniteScrollDirective);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngZone = inject(NgZone);\n public readonly ngControl = inject(NgControl, { optional: true, self: true });\n protected readonly applicationTheme: ApplicationTheme =\n inject<ApplicationTheme>('CANOPYUI_DEFAULT_APPLICATION_THEME' as any, { optional: true }) ?? 'light';\n\n // ── Internal state ──────────────────────────────────────────────────────────\n protected inputValue = signal<string>('');\n protected isInputFocus = signal(false);\n protected autocompleteType = Autocomplete;\n /** Flat list for default (ungrouped) rendering and virtual scroll */\n protected flatItemsList = computed(() => {\n const suggestions = this.suggestionsList();\n const valField = this.valueField();\n const flat = AutocompleteV2Utils.excludeSuggestions<T>(this.itemsList(), suggestions, valField);\n const grouped = this.groupsList().flatMap(g =>\n AutocompleteV2Utils.excludeSuggestions<T>(g.items, suggestions, valField)\n );\n return [...flat, ...grouped];\n });\n\n /** Grouped list — only used when isGrouped is true */\n protected groupedItemsList = computed(() => {\n const suggestions = this.suggestionsList();\n const valField = this.valueField();\n return this.groupsList().map(group => ({\n groupName: group.groupName,\n items: AutocompleteV2Utils.excludeSuggestions<T>(group.items, suggestions, valField),\n }));\n });\n\n protected _isDisabled = signal(false);\n\n protected translationContext = 'AUTOCOMPLETE.';\n protected readonly utils = AutocompleteV2Utils;\n protected keyboardFocused = signal<boolean>(false);\n protected isAlreadyAdded = computed(() => {\n const compareWith = this.compareWith();\n const val = this.valueManager.value();\n const input = this.inputValue();\n if (!input || input === ' ') return false;\n const valArray = AutocompleteV2Utils.isArray(val) ? val : [];\n return !!(compareWith\n ? valArray.find((v: T) => compareWith(v, input as unknown as T))\n : AutocompleteV2Utils.findDuplicate<T>(valArray, input as unknown as T, this.textField()));\n });\n\n protected showClearButton = computed(() => {\n const type = this.type();\n const val = this.valueManager.value();\n\n if (type === (Autocomplete.SINGLE as AutocompleteType)) {\n return this.clearable() && (val?.length || (val ? !!Object.keys(val).length : false));\n }\n return val && val.length > 1;\n });\n\n protected safeErrors = computed(() => this.errors()?.filter(Boolean) ?? []);\n\n private controlInvalid = signal(false);\n\n protected hasError = computed(() => {\n if (this.ngControl) {\n return this.controlInvalid();\n }\n return this.safeErrors().length > 0;\n });\n\n protected hiddenItemsTooltip = computed(() => {\n const value = this.valueManager.value();\n const visibleCount = this.overflowDir?.visibleCount() ?? Infinity;\n if (!AutocompleteV2Utils.isArray(value)) return '';\n const tf = this.textField();\n return value\n .slice(visibleCount)\n .map(item => (tf ? item[tf] : item))\n .join('\\n');\n });\n\n constructor() {\n // Assign valueAccessor manually to avoid circular DI\n // (providing NG_VALUE_ACCESSOR + injecting NgControl creates a cycle)\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n this.filterService.setDynamicResults(this.dynamicFilteredList(), this.dynamicFilterLoading());\n });\n\n effect(() => {\n this._isDisabled.set(this.disabled());\n });\n\n effect(() => this.valueManager.type.set(this.type()));\n effect(() => this.valueManager.textField.set(this.textField()));\n effect(() => this.valueManager.valueField.set(this.valueField()));\n effect(() => this.valueManager.compareWith.set(this.compareWith()));\n\n effect(() => this.filterService.textField.set(this.textField()));\n effect(() => this.filterService.flatItems.set(this.flatItemsList()));\n effect(() => this.filterService.groupsList.set(this.groupsList()));\n effect(() => this.filterService.suggestions.set(this.suggestionsList()));\n\n effect(() => {\n const v = this.itemValue();\n // In CVA mode, writeValue() owns the value — itemValue should not override it\n if (this.ngControl) {\n if (isDevMode() && v !== null) {\n console.warn(\n '[ui-autocomplete-v2] [itemValue] is set alongside a form control. ' + 'Use ngModel or formControl instead.'\n );\n }\n return;\n }\n this.valueManager.value.set(AutocompleteV2Utils.isArray(v) ? v : v ? [v] : []);\n untracked(() => {\n this.inputValue.set(this.valueManager.displayValue());\n });\n this.cdr.markForCheck();\n });\n\n effect(() => {\n this.valueManager.value(); // track value changes\n untracked(() => {\n if (this.type() !== (Autocomplete.LARGE as AutocompleteType)) {\n this.overflowDir?.measure();\n }\n });\n });\n }\n\n /**\n * Used to mark component view as dirty when touched programmatically with markAsTouched/markAllAsTouched or errors\n * to display validation errors that might happen (e.g. required)\n */\n\n ngDoCheck(): void {\n if (this.ngControl) {\n const invalid = !!(this.ngControl.invalid && this.ngControl.touched);\n if (this.controlInvalid() !== invalid) {\n this.controlInvalid.set(invalid);\n }\n if (this.ngControl.touched || this.ngControl.errors) {\n this.cdr.markForCheck();\n }\n }\n }\n\n ngAfterViewInit(): void {\n // Set default hover color for the autocomplete panel (overlay is outside component scope)\n if (!document.body.style.getPropertyValue('--ui-autocomplete-option-color')) {\n document.body.style.setProperty('--ui-autocomplete-option-color', '#FFF2FC');\n }\n\n if (this.type() !== (Autocomplete.LARGE as AutocompleteType)) {\n this.overflowDir?.setupObserver('.input-container');\n }\n\n this.scrollManager.enabled = this.infiniteScroll();\n this.scrollManager.closeOnScroll = this.closeOnScroll();\n this.scrollManager.panelTrigger = this.autocomplete;\n this.scrollManager.onBottomReached = () => this.onScrollBottom();\n this.scrollManager.startCloseOnScroll();\n\n this.focusMonitor\n .monitor(this.matInput)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin =>\n this.ngZone.run(() => {\n this.keyboardFocused.set(origin === 'keyboard');\n })\n );\n\n this.matInput.nativeElement.onkeydown = this.onKeydown.bind(this);\n }\n\n ngOnDestroy(): void {\n this.scrollManager.ngOnDestroy();\n this.focusMonitor.stopMonitoring(this.matInput);\n if (this.matInput?.nativeElement) {\n this.matInput.nativeElement.onkeydown = null;\n }\n }\n\n registerOnChange(fn: any): void {\n this.valueManager.registerOnChange(fn);\n }\n\n registerOnTouched(fn: any): void {\n this.valueManager.registerOnTouched(fn);\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n this.cdr.markForCheck();\n }\n\n writeValue(value: T | T[] | null): void {\n // Eagerly sync config so displayValue() computes correctly even if\n // constructor effects haven't run yet (e.g. first writeValue from a\n // FormControl with an initial value).\n this.valueManager.type.set(this.type());\n this.valueManager.textField.set(this.textField());\n this.valueManager.valueField.set(this.valueField());\n this.valueManager.compareWith.set(this.compareWith());\n\n this.valueManager.writeValue(value);\n this.inputValue.set(this.valueManager.displayValue());\n this.cdr.markForCheck();\n }\n\n protected get isGrouped(): boolean {\n return this.groupsList().length > 0;\n }\n\n protected onOptionSelected(event: MatAutocompleteSelectedEvent): void {\n const inputValue = event.option.value as T;\n const itemValue = AutocompleteV2Utils.createValueItem<T>(inputValue, this.textField(), this.valueField());\n this.valueManager.addValue(itemValue);\n\n queueMicrotask(() => {\n if (this.type() !== (this.autocompleteType.SINGLE as AutocompleteType)) {\n // Multi: clear input so tags are visible while focused\n this.inputValue.set('');\n } else {\n this.inputValue.set(this.valueManager.displayValue());\n }\n this.cdr.markForCheck();\n });\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n protected onOptionRemoved(option: T): void {\n setTimeout(() => this.autocomplete.closePanel(), 0);\n const foundValue = this.valueManager.removeValue(option);\n\n if (foundValue) {\n this.matAutocomplete.options.forEach(matOption => {\n const vf = this.valueField();\n if (vf && matOption.value?.[vf] === foundValue[vf]) {\n matOption.deselect();\n }\n });\n }\n\n if (!this.valueManager.value()?.length) {\n this.inputValue.set('');\n }\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n protected onInputChange(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.filterService.search(text, this.minCharactersSearch());\n if (text.length >= this.minCharactersSearch()) {\n this.searchTextChange.emit(text);\n }\n }\n\n protected onClear(): void {\n this.inputValue.set('');\n this.valueManager.clear();\n this.onUpdate();\n this.matAutocomplete?.options.forEach(option => option.deselect());\n this.valueManager.markAsTouched();\n }\n\n protected onBlur(): void {\n setTimeout(() => {\n this.filterService.clearSearch();\n this.isInputFocus.set(false);\n this.inputValue.set(this.valueManager.displayValue());\n this.valueManager.markAsTouched();\n this.blur.emit();\n this.cdr.markForCheck();\n }, 0);\n }\n\n protected onPanelOpened(): void {\n this.scrollManager.scrollToTop();\n }\n\n protected onScrollBottom(): void {\n if (this.filterService.searchText$.value) {\n this.scrollViewportBottomReachedFiltered.emit();\n } else {\n this.scrollViewportBottomReached.emit();\n }\n }\n\n protected onFocus(): void {\n this.isInputFocus.set(true);\n const val = this.inputValue();\n if (typeof val === 'string' && val.match(/^\\s+/gm)) {\n this.inputValue.set(val.trimStart());\n }\n this.focus.emit();\n }\n\n private onUpdate(): void {\n this.filterService.clearSearch();\n this.valueManager.notifyChange();\n const val = this.valueManager.value();\n if (val !== null) {\n this.selectionChange.emit(val);\n }\n }\n\n protected get isDropdown(): boolean {\n return this.variant() === (DropdownVariation.DROPDOWN as DropdownVariationType);\n }\n\n protected onChevronClick(autocomplete: MatAutocomplete): void {\n if (autocomplete.isOpen) {\n setTimeout(() => {\n this.autocomplete.closePanel();\n }, 0);\n }\n }\n\n protected trackByFn = (index: number, value: string) => value;\n\n protected trackByItem = (_index: number, item: T) => {\n const vf = this.valueField();\n return vf ? item?.[vf] : item;\n };\n\n onKeydown($event: KeyboardEvent) {\n const optionHeight = 48;\n\n if ($event.key === (IKeyboardEvent.HOME as string)) {\n this.matAutocomplete._keyManager.setFirstItemActive();\n } else if ($event.key === (IKeyboardEvent.END as string)) {\n this.matAutocomplete._keyManager.setLastItemActive();\n } else if ($event.key === (IKeyboardEvent.PAGE_DOWN as string)) {\n this.matAutocomplete._keyManager.setNextItemActive();\n this.matAutocomplete._keyManager.setNextItemActive();\n this.matAutocomplete._keyManager.setNextItemActive();\n } else if ($event.key === (IKeyboardEvent.PAGE_UP as string)) {\n this.matAutocomplete._keyManager.setPreviousItemActive();\n this.matAutocomplete._keyManager.setPreviousItemActive();\n this.matAutocomplete._keyManager.setPreviousItemActive();\n }\n\n this.matAutocomplete._setScrollTop((this.matAutocomplete._keyManager.activeItemIndex ?? 0) * optionHeight);\n }\n\n protected getVirtualScrollHeight(itemCount: number): number {\n const itemHeight = 48;\n const maxHeight = 200;\n const minHeight = 48;\n\n const calculatedHeight = itemCount * itemHeight;\n\n return Math.min(Math.max(calculatedHeight, minHeight), maxHeight);\n }\n}\n","<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ disabled: _isDisabled() }\">\n <mat-form-field\n [color]=\"hasError() ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{\n 'large-size': type() === autocompleteType.LARGE,\n 'hide-bottom-content': !showBottomContent(),\n 'keyboard-focused': keyboardFocused(),\n 'has-label': !!label(),\n }\"\n >\n @if (label()) {\n <mat-label\n >{{ label() }}\n @if (required()) {\n <span>*</span>\n }\n </mat-label>\n }\n <div #formField class=\"input-container\">\n @if (textField() ? $any(valueManager.value())?.[textField()] : $any(valueManager.value()) === inputValue()) {\n <span style=\"position: absolute; left: -9999px\" aria-live=\"polite\">{{\n ('SELECTED' | uiTranslate | async) + ' ' + inputValue()\n }}</span>\n }\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [attr.maxlength]=\"maxLength() !== null && maxLength() !== undefined ? maxLength() : null\"\n [uiPreventInput]=\"!allowUserInput()\"\n [disabled]=\"_isDisabled()\"\n [ngClass]=\"{\n 'unset-margin': valueManager.value() && type() === autocompleteType.LARGE,\n 'no-caret': !allowUserInput(),\n }\"\n (blur)=\"onBlur()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"\n (translationContext + 'SELECTED' | uiTranslate | async) +\n ' ' +\n (valueManager.value() | transformItem: textField() : true)\n \"\n matInput\n [placeholder]=\"valueManager.value() && valueManager.value()!.length ? '' : placeholder()\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [ngModel]=\"inputValue()\"\n (ngModelChange)=\"inputValue.set($event)\"\n />\n <!-- Hidden measurement container: always in DOM, renders ALL tags for width measurement -->\n @if (type() !== autocompleteType.SINGLE && utils.isArray(valueManager.value())) {\n <div class=\"selected-items measurement-container\" #measureEl>\n @for (valueItem of $any(valueManager.value()); track valueItem; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'measure-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-tag>\n }\n </div>\n }\n\n @if (\n (type() === autocompleteType.LARGE && valueManager.value()) ||\n (!(inputValue() && isInputFocus()) && valueManager.value() && type() !== autocompleteType.SINGLE)\n ) {\n <!-- Visible container: only renders tags that fit. Hidden until first measurement to prevent flash. -->\n <div\n class=\"selected-items\"\n #tagContainer\n uiAutocompleteOverflowDetect\n #overflow=\"autocompleteOverflowDetect\"\n [measureContainer]=\"measureElRef?.nativeElement\"\n [class.measured]=\"\n type() === autocompleteType.LARGE || type() === autocompleteType.SINGLE || overflow.hasMeasured()\n \"\n >\n @if (size() === 'small' && valueManager.value()!.length > 1) {\n <div class=\"selected-count\">\n {{\n translationContext + 'SELECTED_AMOUNT'\n | uiTranslate: { numberSelected: valueManager.value()!.length }\n | async\n }}\n </div>\n } @else {\n @for (valueItem of $any(valueManager.value()); track valueItem; let i = $index) {\n @if (i < overflow.visibleCount()) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [ngStyle]=\"\n type() !== autocompleteType.LARGE\n ? { '--tag-max-width': overflow.tagMaxWidth() ? overflow.tagMaxWidth() + 'px' : 'fit-content' }\n : {}\n \"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n }\n }\n @if (overflow.overflowCount() > 0) {\n <div class=\"overlap-count\" [matTooltip]=\"hiddenItemsTooltip()\">\n <ui-tag [applicationTheme]=\"applicationTheme\" [label]=\"'+' + overflow.overflowCount()\"></ui-tag>\n </div>\n }\n }\n </div>\n }\n </div>\n\n @if (showClearButton()) {\n <ui-icon\n class=\"remove-selected\"\n [tabIndex]=\"_isDisabled() ? -1 : 0\"\n (keydown.enter)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n (keydown.space)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type() === autocompleteType.LARGE }\"\n (click)=\"onClear(); $event.preventDefault(); $event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"'COMMON.CLEAR' | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n }\n\n @if (isDropdown) {\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type() === autocompleteType.LARGE }\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n }\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass()\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"onPanelOpened()\"\n >\n <!-- Reusable option template — must be inside mat-autocomplete for @ContentChildren to find mat-options -->\n <ng-template #optionTpl let-item=\"item\" let-highlight=\"highlight\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"highlight ? (filterService.userInput$ | async) : null\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </ng-template>\n\n <!-- ── Unfiltered ───────────────────────────────────────────────── -->\n @if ((filterService.isSearching$ | async) === false) {\n @if (!isDropdown) {\n <!-- Suggestions -->\n @if (suggestionsList().length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n @for (suggested of suggestionsList(); track suggested) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: suggested, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Selected items (multi) -->\n @if (valueManager.value()?.length && type() !== autocompleteType.SINGLE) {\n <mat-optgroup [label]=\"(translationContext + 'SELECTED' | uiTranslate | async)! | uppercase\">\n @for (item of $any(valueManager.value()); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: false }\"></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Main items (normalized groups) -->\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(flatItemsList().length)\"\n class=\"virtual-scroll\"\n >\n @if (!isGrouped) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of flatItemsList(); trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n } @else {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n\n @if (infiniteScroll() && hasMoreOptionsForInfiniteScroll()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (isGrouped) {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n } @else {\n @for (item of flatItemsList(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n }\n }\n\n <!-- Selected item (single) -->\n @if (valueManager.value()?.length && type() === autocompleteType.SINGLE) {\n <mat-optgroup [label]=\"(translationContext + 'SELECTED' | uiTranslate | async)! | uppercase\">\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: valueManager.value(), highlight: true }\"\n ></ng-container>\n </mat-optgroup>\n }\n } @else {\n <!-- ── Dropdown (unfiltered) ────────────────────────────────── -->\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(flatItemsList().length)\"\n class=\"virtual-scroll\"\n >\n @if (!isGrouped) {\n <!-- Ungrouped: flat cdkVirtualFor directly in viewport -->\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of flatItemsList(); trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n } @else {\n <!-- Grouped: nested cdkVirtualFor per group -->\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of group.items; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n\n @if (infiniteScroll() && hasMoreOptionsForInfiniteScroll()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (isGrouped) {\n @for (group of groupedItemsList(); track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.items; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n } @else {\n @for (item of flatItemsList(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n }\n }\n }\n }\n\n <!-- ── Filtered ────────────────────────────────────────────────── -->\n @if (filterService.filteredSuggestions$ | async; as filteredSuggestionList) {\n @if (filterService.filteredItems$ | async; as filteredItemsList) {\n @if (virtualScroll() || infiniteScroll()) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"48\"\n [style.height.px]=\"getVirtualScrollHeight(filteredItemsList.length)\"\n class=\"virtual-scroll\"\n >\n <!-- Filtered suggestions -->\n @if (filteredSuggestionList.length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n *cdkVirtualFor=\"let item of filteredSuggestionList; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n }\n\n <!-- Filtered items: grouped -->\n @if (isGrouped && (filterService.filteredGroupedItems$ | async); as filteredGroups) {\n @if (filteredGroups.length) {\n @for (group of filteredGroups; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.filteredItems; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n *cdkVirtualFor=\"let item of group.filteredItems; trackBy: trackByItem\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n }\n }\n }\n\n <!-- Filtered items: ungrouped (no suggestions) -->\n @if (!filteredSuggestionList.length && !isGrouped) {\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n } @else {\n <!-- Filtered items: ungrouped with suggestions present (ALL_ITEMS group) -->\n @if (filteredItemsList.length && !isGrouped) {\n <mat-optgroup [label]=\"(translationContext + 'ALL_ITEMS' | uiTranslate | async)! | uppercase\">\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{\n 'selected-option': item | includes: valueManager.value() ?? [] : valueField(),\n }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (dynamicFilterLoading()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if (inputValue()) {\n @if (allowAdd() && !isAlreadyAdded()) {\n <mat-option (mousedown)=\"$event.preventDefault()\" [value]=\"inputValue()\">\n <span>{{ 'COMMON.ADD' | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue() }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n <!-- Filtered items: grouped -->\n @if (isGrouped && (filterService.filteredGroupedItems$ | async); as filteredGroups) {\n @if (filteredGroups.length) {\n @for (group of filteredGroups; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n @for (item of group.filteredItems; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n } @else {\n @for (item of group.filteredItems; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n }\n }\n }\n }\n\n <!-- Filtered suggestions -->\n @if (filteredSuggestionList.length) {\n <mat-optgroup [label]=\"(translationContext + 'SUGGESTED' | uiTranslate | async)! | uppercase\">\n @for (item of filteredSuggestionList; track item) {\n <ng-container\n *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n }\n </mat-optgroup>\n }\n\n <!-- Filtered items: ungrouped (no suggestions) -->\n @if (!filteredSuggestionList.length && !isGrouped) {\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{ item | transformItem: textField() }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n } @else {\n <!-- Filtered items: ungrouped with suggestions present (ALL_ITEMS group) -->\n @if (filteredItemsList.length && !isGrouped) {\n <mat-optgroup [label]=\"(translationContext + 'ALL_ITEMS' | uiTranslate | async)! | uppercase\">\n @for (item of filteredItemsList; let idx = $index; track item[valueField()] || idx) {\n <mat-option\n (mousedown)=\"$event.preventDefault()\"\n [ngClass]=\"{ 'selected-option': item | includes: valueManager.value() ?? [] : valueField() }\"\n [value]=\"item\"\n >\n <span [selectText]=\"filterService.userInput$ | async\">{{\n item | transformItem: textField()\n }}</span>\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"\n ></ui-icon>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (dynamicFilterLoading()) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if (inputValue()) {\n @if (allowAdd() && !isAlreadyAdded()) {\n <mat-option (mousedown)=\"$event.preventDefault()\" [value]=\"inputValue()\">\n <span>{{ 'COMMON.ADD' | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue() }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n }\n }\n }\n </mat-autocomplete>\n @if (hasError()) {\n <mat-hint class=\"error\">\n @if (ngControl) {\n <ui-validation-error\n [ngControl]=\"ngControl\"\n [customErrors]=\"formErrorConfig()\"\n [label]=\"label()\"\n ></ui-validation-error>\n } @else {\n @for (error of safeErrors(); track error) {\n <div class=\"errors\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ error }}</span>\n </div>\n }\n }\n </mat-hint>\n }\n </mat-form-field>\n </div>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|