@testgorilla/tgo-ui 12.2.0 → 12.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +6 -1
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs +6 -4
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
- package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
- package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +7 -1
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs +8 -2
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs +12 -3
- package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +6 -2
- package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
- package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
- package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
- package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +4 -1
- package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs +5 -2
- package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-scale.mjs +9 -2
- package/fesm2022/testgorilla-tgo-ui-components-scale.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
- package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +7 -4
- package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-slider.mjs +13 -4
- package/fesm2022/testgorilla-tgo-ui-components-slider.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
- package/mcp/catalog.json +1 -1
- package/package.json +2 -2
- package/types/testgorilla-tgo-ui-components-alert-banner.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-autocomplete-v2.d.ts +1 -1
- package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
- package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-field.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-infinite-scroll-table.d.ts +3 -3
- package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
- package/types/testgorilla-tgo-ui-components-radio-button.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-scale.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
- package/types/testgorilla-tgo-ui-components-slider.d.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-autocomplete-v2.mjs","names":[],"sources":["../../../components/autocomplete-v2/autocomplete-overflow-detect.directive.ts","../../../components/autocomplete-v2/autocomplete-tag-suffix.directive.ts","../../../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-v2.component.ts","../../../components/autocomplete-v2/autocomplete-v2.component.html"],"sourcesContent":["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') {\n return;\n }\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) {\n return;\n }\n\n this.rafId = requestAnimationFrame(() => {\n const infix = container.closest('.mat-mdc-form-field-infix') as HTMLElement;\n if (!infix) {\n return;\n } // 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","import { Directive, inject, TemplateRef } from '@angular/core';\n\nexport interface AutocompleteTagSuffixContext<T = Record<string, unknown>> {\n /** The selected item the tag represents. */\n $implicit: T;\n /** The tag's position in the selection. */\n index: number;\n}\n\n/**\n * Marks an `ng-template` whose content is rendered inside each selected tag, after its label.\n * Only applies with `tagsPosition=\"below\"`.\n *\n * ```html\n * <ui-autocomplete-v2 tagsPosition=\"below\" ...>\n * <ng-template uiAutocompleteTagSuffix let-item>{{ item.radius }}</ng-template>\n * </ui-autocomplete-v2>\n * ```\n */\n@Directive({\n selector: 'ng-template[uiAutocompleteTagSuffix]',\n})\nexport class AutocompleteTagSuffixDirective<T = Record<string, unknown>> {\n readonly templateRef = inject<TemplateRef<AutocompleteTagSuffixContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: AutocompleteTagSuffixDirective<T>,\n _ctx: unknown\n ): _ctx is AutocompleteTagSuffixContext<T> {\n return true;\n }\n}\n","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) {\n return items ?? [];\n }\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 /**\n * True when the typed text exactly matches the label of any displayed option\n * (case-insensitive, trimmed). Used to suppress the \"Add …\" option when the\n * value already exists among the options being shown.\n */\n static hasExactMatch<T extends Item>(items: T[], suggestions: T[], inputValue: string, textField: string): boolean {\n const normalized = inputValue.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n const isMatch = (item: T): boolean => {\n const text = textField ? item[textField] : item;\n return typeof text === 'string' && text.toLowerCase() === normalized;\n };\n return (items ?? []).some(isMatch) || (suggestions ?? []).some(isMatch);\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';\n\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteGroup } from './autocomplete-v2.component';\n\n@Injectable()\nexport class AutocompleteFilterService<T extends Record<string, unknown> = Record<string, unknown>>\n implements OnDestroy\n{\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 => Boolean(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) {\n return null;\n }\n return AutocompleteV2Utils.filterItems<T>(this.flatItems(), inputValue, this.textField());\n })\n );\n\n readonly filteredGroupedItems$: Observable<{ groupName: string; items: T[]; filteredItems: T[] }[] | null> =\n this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length || !this.groupsList().length) {\n return null;\n }\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\nexport type AddOptionPosition = 'top' | 'bottom';\n\nexport type TagsPosition = 'inside' | 'below';\n","import { computed, Injectable, signal } from '@angular/core';\n\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { Autocomplete, AutocompleteType } from './autocomplete-v2.model';\n\n@Injectable()\nexport class AutocompleteValueManager<T extends Record<string, unknown> = Record<string, unknown>> {\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) {\n return '';\n }\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\n private onChangeFn: (value: T | T[] | null) => void = () => {};\n\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 || v === undefined) {\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 { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { DestroyRef, inject, Injectable, OnDestroy } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\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 readonly destroyRef = inject(DestroyRef);\n\n private readonly scrollListener = (event: Event): void => {\n const target = event.target as Element | null;\n const trigger = this.panelTrigger;\n if (!trigger) {\n return;\n }\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) {\n return;\n }\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","/* 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 contentChild,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n output,\n ProviderToken,\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';\n\nimport {\n ApplicationTheme,\n IKeyboardEvent,\n IncludesPipe,\n PreventInputDirective,\n SelectTextDirective,\n TransformItemPipe,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule, IconName } 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';\n\nimport { AutocompleteOverflowDetectDirective } from './autocomplete-overflow-detect.directive';\nimport { AutocompleteTagSuffixDirective } from './autocomplete-tag-suffix.directive';\nimport { AutocompleteFilterService } from './autocomplete-v2-filter.service';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteValueManager } from './autocomplete-v2-value-manager';\nimport {\n Autocomplete,\n AddOptionPosition,\n AutocompleteSize,\n AutocompleteType,\n DropdownVariation,\n DropdownVariationType,\n TagsPosition,\n} from './autocomplete-v2.model';\nimport { InfiniteScrollDirective } from './infinite-scroll.directive';\n\nexport interface AutocompleteGroup<T extends Record<string, unknown> = Record<string, unknown>> {\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, unknown> = Record<string, unknown>>\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 imageField = input('');\n label = input('');\n placeholder = input('');\n\n readonly testId = input<string | null>(null);\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 panelPosition = input<MatAutocompleteTrigger['position']>('auto');\n hideSelectedSection = input(false, { transform: booleanAttribute });\n userAdditionsGroupLabel = 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 addOptionPosition = input<AddOptionPosition>('bottom');\n tagsPosition = input<TagsPosition>('inside');\n /**\n * Icon shown before the label of each selected tag: one icon for every tag, or a function that picks\n * it per item (return `''` for no icon). Only applies with `tagsPosition=\"below\"`.\n */\n tagIcon = input<IconName | ((item: T) => IconName)>('');\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n selectionChange = output<T | T[]>();\n searchTextChange = output<string>();\n // eslint-disable-next-line @angular-eslint/no-output-native -- output shadows a native event; rename is breaking, deferred to the breaking-change MAJOR (see plan)\n blur = output<void>();\n // eslint-disable-next-line @angular-eslint/no-output-native -- output shadows a native event; rename is breaking, deferred to the breaking-change MAJOR (see plan)\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 protected readonly tagSuffix = contentChild<AutocompleteTagSuffixDirective<T>>(AutocompleteTagSuffixDirective);\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 unknown as ProviderToken<ApplicationTheme>, {\n optional: true,\n }) ?? '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 protected userAddedItems = signal<T[]>([]);\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 inputVal = this.inputValue();\n if (!inputVal || inputVal === ' ') {\n return false;\n }\n const valArray = AutocompleteV2Utils.isArray(val) ? val : [];\n return Boolean(\n compareWith\n ? valArray.find((v: T) => compareWith(v, inputVal as unknown as T))\n : AutocompleteV2Utils.findDuplicate<T>(valArray, inputVal as unknown as T, this.textField())\n );\n });\n\n protected readonly tagsBelow = computed(\n () => this.tagsPosition() === 'below' && this.type() === (Autocomplete.MULTI as AutocompleteType)\n );\n\n protected readonly suppressPlaceholder = computed(\n () => !this.tagsBelow() && Boolean((this.valueManager.value() as T[] | null)?.length)\n );\n\n protected showClearButton = computed(() => {\n if (this.tagsBelow()) {\n return false;\n }\n const type = this.type();\n const val = this.valueManager.value();\n\n if (type === (Autocomplete.SINGLE as AutocompleteType)) {\n const hasValue = Array.isArray(val) ? val.length > 0 : val ? Object.keys(val).length > 0 : false;\n return this.clearable() && hasValue;\n }\n return Array.isArray(val) && val.length > 1;\n });\n\n /** Icon per below-tag, in selection order */\n protected readonly tagIcons = computed<IconName[]>(() => {\n const icon = this.tagIcon();\n const value = this.valueManager.value();\n if (!AutocompleteV2Utils.isArray(value)) {\n return [];\n }\n return value.map(item => (typeof icon === 'function' ? icon(item) : icon));\n });\n\n protected safeErrors = computed(() => this.errors()?.filter(Boolean) ?? []);\n\n private readonly 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)) {\n return '';\n }\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 const disabled = this.disabled();\n // In CVA mode, setDisabledState() owns the disabled state — the [disabled] input must not\n // override it, otherwise this effect's initial run clobbers a control that starts disabled.\n if (this.ngControl) {\n if (isDevMode() && disabled) {\n console.warn(\n '[ui-autocomplete-v2] [disabled] is set alongside a form control. ' +\n 'Use the form control disabled state (disable()/enable()) instead.'\n );\n }\n return;\n }\n this._isDisabled.set(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 if (!this.tagsBelow()) {\n this.inputValue.set(this.valueManager.displayValue());\n }\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 = Boolean(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: (value: T | T[] | null) => void): void {\n this.valueManager.registerOnChange(fn);\n }\n\n registerOnTouched(fn: () => void): 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\n // Drop tracked user-additions that are no longer in the externally-written value.\n if (this.userAdditionsGroupLabel()) {\n this.userAddedItems.update(items => {\n const v = this.valueManager.value();\n if (!AutocompleteV2Utils.isArray(v) || v.length === 0) {\n return [];\n }\n const vf = this.valueField();\n const tf = this.textField();\n return items.filter(i => v.some(x => (vf ? x[vf] === i[vf] : tf ? x[tf] === i[tf] : x === i)));\n });\n }\n\n this.inputValue.set(this.tagsBelow() ? '' : 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\n const lengthBefore = AutocompleteV2Utils.isArray(this.valueManager.value())\n ? (this.valueManager.value() as T[]).length\n : 0;\n this.valueManager.addValue(itemValue);\n const lengthAfter = AutocompleteV2Utils.isArray(this.valueManager.value())\n ? (this.valueManager.value() as T[]).length\n : 0;\n const wasAdded = lengthAfter > lengthBefore;\n\n if (wasAdded && typeof event.option.value === 'string' && this.userAdditionsGroupLabel()) {\n const vf = this.valueField();\n const tf = this.textField();\n const alreadyTracked = vf\n ? this.userAddedItems().some(i => i[vf] === itemValue[vf])\n : tf\n ? this.userAddedItems().some(i => i[tf] === itemValue[tf])\n : this.userAddedItems().some(i => i === itemValue);\n if (!alreadyTracked) {\n this.userAddedItems.update(items => [...items, itemValue]);\n }\n }\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 as T | undefined)?.[vf] === foundValue[vf]) {\n matOption.deselect();\n }\n });\n }\n\n if (this.userAdditionsGroupLabel()) {\n const vf = this.valueField();\n this.userAddedItems.update(items => items.filter(item => (vf ? item[vf] !== option[vf] : item !== option)));\n }\n\n if (!this.valueManager.value()?.length) {\n this.inputValue.set('');\n }\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n /**\n * Makes the whole below-tag a hit area for the control in its `uiAutocompleteTagSuffix` content\n * (e.g. a menu trigger). The remove icon keeps its own behavior, and presses inside the suffix never\n * reach here because the tag stops them.\n */\n protected onTagActivate(event: Event): void {\n const target = event.target as HTMLElement;\n if (this._isDisabled() || target.closest('.delete-icon')) {\n return;\n }\n // Keyboard activation only from the tag itself, not from a focused child.\n if (event instanceof KeyboardEvent && !target.classList.contains('tag-container')) {\n return;\n }\n const control = (event.currentTarget as HTMLElement).querySelector<HTMLElement>(\n '.tag-suffix button, .tag-suffix [role=\"button\"], .tag-suffix a[href]'\n );\n if (control) {\n event.preventDefault();\n control.click();\n }\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.userAddedItems.set([]);\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.tagsBelow() ? '' : 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\n #formField\n class=\"input-container\"\n [class.has-multiple-selections]=\"\n type() === autocompleteType.LARGE &&\n utils.isArray(valueManager.value()) &&\n $any(valueManager.value()).length > 1\n \"\n [class.autocomplete-variant]=\"type() === autocompleteType.LARGE && !isDropdown\"\n >\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 [attr.data-testid]=\"testId() ?? 'autocomplete-v2-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]=\"suppressPlaceholder() ? '' : placeholder()\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"panelPosition()\"\n (input)=\"onInputChange($event)\"\n [ngModel]=\"inputValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"inputValue.set($event)\"\n />\n <!-- Hidden measurement container: always in DOM, renders ALL tags for width measurement -->\n @if (!tagsBelow() && type() !== autocompleteType.SINGLE && utils.isArray(valueManager.value())) {\n <div class=\"selected-items measurement-container\" #measureEl>\n @for (valueItem of $any(valueManager.value()); track valueItem[valueField()] || i; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'measure-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [isDisabled]=\"disabled()\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-tag>\n }\n </div>\n }\n\n @if (\n !tagsBelow() &&\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]=\"$safeNavigationMigration(measureElRef?.nativeElement)\"\n [class.measured]=\"\n type() === autocompleteType.LARGE || type() === autocompleteType.SINGLE || overflow.hasMeasured()\n \"\n >\n @if (size() === 'small' && $any(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[valueField()] || i; 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 [isDisabled]=\"disabled()\"\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\n [applicationTheme]=\"applicationTheme\"\n [isDisabled]=\"disabled()\"\n [label]=\"'+' + overflow.overflowCount()\"\n ></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 <ng-template #optionContentTpl let-item=\"item\" let-highlight=\"highlight\">\n @if (imageField() && item?.[imageField()]) {\n <img class=\"option-image\" [src]=\"item[imageField()]\" alt=\"\" />\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 </ng-template>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: highlight }\"\n ></ng-container>\n </mat-option>\n </ng-template>\n\n <!-- Reusable \"Add\"/no-results/loading option for the filtered view -->\n <ng-template #addOptionTpl let-items=\"items\" let-suggestions=\"suggestions\">\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 (\n allowAdd() && !isAlreadyAdded() && !utils.hasExactMatch(items, suggestions, inputValue(), textField())\n ) {\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 (!items.length && !suggestions.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\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 && !hideSelectedSection()) {\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 && !hideSelectedSection()) {\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 @if (userAdditionsGroupLabel() && userAddedItems().length) {\n <mat-optgroup [label]=\"userAdditionsGroupLabel()\">\n @for (item of userAddedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n </mat-optgroup>\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 @if (addOptionPosition() === 'top') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (addOptionPosition() === 'bottom') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (addOptionPosition() === 'top') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 @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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (addOptionPosition() === 'bottom') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 @if (tagsBelow() && valueManager.value()?.length) {\n <div class=\"selected-items--below\">\n @for (valueItem of $any(valueManager.value()); track valueItem[valueField()] || i; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'below-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [icon]=\"tagIcons()[i]\"\n [allowClose]=\"true\"\n [isDisabled]=\"disabled()\"\n [constrainWidth]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n (close)=\"onOptionRemoved(valueItem)\"\n (click)=\"onTagActivate($event)\"\n (keydown.enter)=\"onTagActivate($event)\"\n (keydown.space)=\"onTagActivate($event)\"\n >\n @if (tagSuffix(); as suffix) {\n <span class=\"value-tag__suffix\" uiTagSuffix>\n <ng-container *ngTemplateOutlet=\"suffix.templateRef; context: { $implicit: valueItem, index: i }\" />\n </span>\n }\n </ui-tag>\n }\n <!-- Consumer content rendered as a sibling of the selected tags, before the clear button -->\n <ng-content select=\"[autocompleteTagsSuffix]\"></ng-content>\n @if (clearable()) {\n <button type=\"button\" class=\"clear-all\" [disabled]=\"_isDisabled()\" (click)=\"onClear()\">\n {{ 'COMMON.CLEAR' | uiTranslate | async }}\n </button>\n }\n </div>\n }\n </div>\n</ng-container>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-autocomplete-v2.mjs","names":[],"sources":["../../../components/autocomplete-v2/autocomplete-overflow-detect.directive.ts","../../../components/autocomplete-v2/autocomplete-tag-suffix.directive.ts","../../../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-v2.component.ts","../../../components/autocomplete-v2/autocomplete-v2.component.html"],"sourcesContent":["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') {\n return;\n }\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) {\n return;\n }\n\n this.rafId = requestAnimationFrame(() => {\n const infix = container.closest('.mat-mdc-form-field-infix') as HTMLElement;\n if (!infix) {\n return;\n } // 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","import { Directive, inject, TemplateRef } from '@angular/core';\n\nexport interface AutocompleteTagSuffixContext<T = Record<string, unknown>> {\n /** The selected item the tag represents. */\n $implicit: T;\n /** The tag's position in the selection. */\n index: number;\n}\n\n/**\n * Marks an `ng-template` whose content is rendered inside each selected tag, after its label.\n * Only applies with `tagsPosition=\"below\"`.\n *\n * ```html\n * <ui-autocomplete-v2 tagsPosition=\"below\" ...>\n * <ng-template uiAutocompleteTagSuffix let-item>{{ item.radius }}</ng-template>\n * </ui-autocomplete-v2>\n * ```\n */\n@Directive({\n selector: 'ng-template[uiAutocompleteTagSuffix]',\n})\nexport class AutocompleteTagSuffixDirective<T = Record<string, unknown>> {\n readonly templateRef = inject<TemplateRef<AutocompleteTagSuffixContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: AutocompleteTagSuffixDirective<T>,\n _ctx: unknown\n ): _ctx is AutocompleteTagSuffixContext<T> {\n return true;\n }\n}\n","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) {\n return items ?? [];\n }\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 /**\n * True when the typed text exactly matches the label of any displayed option\n * (case-insensitive, trimmed). Used to suppress the \"Add …\" option when the\n * value already exists among the options being shown.\n */\n static hasExactMatch<T extends Item>(items: T[], suggestions: T[], inputValue: string, textField: string): boolean {\n const normalized = inputValue.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n const isMatch = (item: T): boolean => {\n const text = textField ? item[textField] : item;\n return typeof text === 'string' && text.toLowerCase() === normalized;\n };\n return (items ?? []).some(isMatch) || (suggestions ?? []).some(isMatch);\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';\n\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteGroup } from './autocomplete-v2.component';\n\n@Injectable()\nexport class AutocompleteFilterService<T extends Record<string, unknown> = Record<string, unknown>>\n implements OnDestroy\n{\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 => Boolean(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) {\n return null;\n }\n return AutocompleteV2Utils.filterItems<T>(this.flatItems(), inputValue, this.textField());\n })\n );\n\n readonly filteredGroupedItems$: Observable<{ groupName: string; items: T[]; filteredItems: T[] }[] | null> =\n this.searchText$.pipe(\n startWith(''),\n map(inputValue => {\n if (!inputValue.length || !this.groupsList().length) {\n return null;\n }\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(results: T[] | null | undefined, loading: boolean): void {\n // A template `a?.b` binding yields `undefined` since Angular 22 (it was `null`).\n const list = results ?? null;\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\nexport type AddOptionPosition = 'top' | 'bottom';\n\nexport type TagsPosition = 'inside' | 'below';\n","import { computed, Injectable, signal } from '@angular/core';\n\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { Autocomplete, AutocompleteType } from './autocomplete-v2.model';\n\n@Injectable()\nexport class AutocompleteValueManager<T extends Record<string, unknown> = Record<string, unknown>> {\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) {\n return '';\n }\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\n private onChangeFn: (value: T | T[] | null) => void = () => {};\n\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 || v === undefined) {\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 { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { DestroyRef, inject, Injectable, OnDestroy } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\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 readonly destroyRef = inject(DestroyRef);\n\n private readonly scrollListener = (event: Event): void => {\n const target = event.target as Element | null;\n const trigger = this.panelTrigger;\n if (!trigger) {\n return;\n }\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) {\n return;\n }\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","/* 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 contentChild,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n output,\n ProviderToken,\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';\n\nimport {\n ApplicationTheme,\n IKeyboardEvent,\n IncludesPipe,\n PreventInputDirective,\n SelectTextDirective,\n TransformItemPipe,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule, IconName } 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';\n\nimport { AutocompleteOverflowDetectDirective } from './autocomplete-overflow-detect.directive';\nimport { AutocompleteTagSuffixDirective } from './autocomplete-tag-suffix.directive';\nimport { AutocompleteFilterService } from './autocomplete-v2-filter.service';\nimport { AutocompleteV2Utils } from './autocomplete-v2-utils';\nimport { AutocompleteValueManager } from './autocomplete-v2-value-manager';\nimport {\n Autocomplete,\n AddOptionPosition,\n AutocompleteSize,\n AutocompleteType,\n DropdownVariation,\n DropdownVariationType,\n TagsPosition,\n} from './autocomplete-v2.model';\nimport { InfiniteScrollDirective } from './infinite-scroll.directive';\n\nexport interface AutocompleteGroup<T extends Record<string, unknown> = Record<string, unknown>> {\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, unknown> = Record<string, unknown>>\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 imageField = input('');\n label = input('');\n placeholder = input('');\n\n readonly testId = input<string | null>(null);\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 panelPosition = input<MatAutocompleteTrigger['position']>('auto');\n hideSelectedSection = input(false, { transform: booleanAttribute });\n userAdditionsGroupLabel = 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 addOptionPosition = input<AddOptionPosition>('bottom');\n tagsPosition = input<TagsPosition>('inside');\n /**\n * Icon shown before the label of each selected tag: one icon for every tag, or a function that picks\n * it per item (return `''` for no icon). Only applies with `tagsPosition=\"below\"`.\n */\n tagIcon = input<IconName | ((item: T) => IconName)>('');\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n selectionChange = output<T | T[]>();\n searchTextChange = output<string>();\n // eslint-disable-next-line @angular-eslint/no-output-native -- output shadows a native event; rename is breaking, deferred to the breaking-change MAJOR (see plan)\n blur = output<void>();\n // eslint-disable-next-line @angular-eslint/no-output-native -- output shadows a native event; rename is breaking, deferred to the breaking-change MAJOR (see plan)\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 protected readonly tagSuffix = contentChild<AutocompleteTagSuffixDirective<T>>(AutocompleteTagSuffixDirective);\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 unknown as ProviderToken<ApplicationTheme>, {\n optional: true,\n }) ?? '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 protected userAddedItems = signal<T[]>([]);\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 inputVal = this.inputValue();\n if (!inputVal || inputVal === ' ') {\n return false;\n }\n const valArray = AutocompleteV2Utils.isArray(val) ? val : [];\n return Boolean(\n compareWith\n ? valArray.find((v: T) => compareWith(v, inputVal as unknown as T))\n : AutocompleteV2Utils.findDuplicate<T>(valArray, inputVal as unknown as T, this.textField())\n );\n });\n\n protected readonly tagsBelow = computed(\n () => this.tagsPosition() === 'below' && this.type() === (Autocomplete.MULTI as AutocompleteType)\n );\n\n protected readonly suppressPlaceholder = computed(\n () => !this.tagsBelow() && Boolean((this.valueManager.value() as T[] | null)?.length)\n );\n\n protected showClearButton = computed(() => {\n if (this.tagsBelow()) {\n return false;\n }\n const type = this.type();\n const val = this.valueManager.value();\n\n if (type === (Autocomplete.SINGLE as AutocompleteType)) {\n const hasValue = Array.isArray(val) ? val.length > 0 : val ? Object.keys(val).length > 0 : false;\n return this.clearable() && hasValue;\n }\n return Array.isArray(val) && val.length > 1;\n });\n\n /** Icon per below-tag, in selection order */\n protected readonly tagIcons = computed<IconName[]>(() => {\n const icon = this.tagIcon();\n const value = this.valueManager.value();\n if (!AutocompleteV2Utils.isArray(value)) {\n return [];\n }\n return value.map(item => (typeof icon === 'function' ? icon(item) : icon));\n });\n\n protected safeErrors = computed(() => this.errors()?.filter(Boolean) ?? []);\n\n private readonly 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)) {\n return '';\n }\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 const disabled = this.disabled();\n // In CVA mode, setDisabledState() owns the disabled state — the [disabled] input must not\n // override it, otherwise this effect's initial run clobbers a control that starts disabled.\n if (this.ngControl) {\n if (isDevMode() && disabled) {\n console.warn(\n '[ui-autocomplete-v2] [disabled] is set alongside a form control. ' +\n 'Use the form control disabled state (disable()/enable()) instead.'\n );\n }\n return;\n }\n this._isDisabled.set(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 && v !== undefined) {\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 if (!this.tagsBelow()) {\n this.inputValue.set(this.valueManager.displayValue());\n }\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 = Boolean(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: (value: T | T[] | null) => void): void {\n this.valueManager.registerOnChange(fn);\n }\n\n registerOnTouched(fn: () => void): 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\n // Drop tracked user-additions that are no longer in the externally-written value.\n if (this.userAdditionsGroupLabel()) {\n this.userAddedItems.update(items => {\n const v = this.valueManager.value();\n if (!AutocompleteV2Utils.isArray(v) || v.length === 0) {\n return [];\n }\n const vf = this.valueField();\n const tf = this.textField();\n return items.filter(i => v.some(x => (vf ? x[vf] === i[vf] : tf ? x[tf] === i[tf] : x === i)));\n });\n }\n\n this.inputValue.set(this.tagsBelow() ? '' : 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\n const lengthBefore = AutocompleteV2Utils.isArray(this.valueManager.value())\n ? (this.valueManager.value() as T[]).length\n : 0;\n this.valueManager.addValue(itemValue);\n const lengthAfter = AutocompleteV2Utils.isArray(this.valueManager.value())\n ? (this.valueManager.value() as T[]).length\n : 0;\n const wasAdded = lengthAfter > lengthBefore;\n\n if (wasAdded && typeof event.option.value === 'string' && this.userAdditionsGroupLabel()) {\n const vf = this.valueField();\n const tf = this.textField();\n const alreadyTracked = vf\n ? this.userAddedItems().some(i => i[vf] === itemValue[vf])\n : tf\n ? this.userAddedItems().some(i => i[tf] === itemValue[tf])\n : this.userAddedItems().some(i => i === itemValue);\n if (!alreadyTracked) {\n this.userAddedItems.update(items => [...items, itemValue]);\n }\n }\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 as T | undefined)?.[vf] === foundValue[vf]) {\n matOption.deselect();\n }\n });\n }\n\n if (this.userAdditionsGroupLabel()) {\n const vf = this.valueField();\n this.userAddedItems.update(items => items.filter(item => (vf ? item[vf] !== option[vf] : item !== option)));\n }\n\n if (!this.valueManager.value()?.length) {\n this.inputValue.set('');\n }\n\n this.onUpdate();\n this.valueManager.markAsTouched();\n }\n\n /**\n * Makes the whole below-tag a hit area for the control in its `uiAutocompleteTagSuffix` content\n * (e.g. a menu trigger). The remove icon keeps its own behavior, and presses inside the suffix never\n * reach here because the tag stops them.\n */\n protected onTagActivate(event: Event): void {\n const target = event.target as HTMLElement;\n if (this._isDisabled() || target.closest('.delete-icon')) {\n return;\n }\n // Keyboard activation only from the tag itself, not from a focused child.\n if (event instanceof KeyboardEvent && !target.classList.contains('tag-container')) {\n return;\n }\n const control = (event.currentTarget as HTMLElement).querySelector<HTMLElement>(\n '.tag-suffix button, .tag-suffix [role=\"button\"], .tag-suffix a[href]'\n );\n if (control) {\n event.preventDefault();\n control.click();\n }\n }\n\n protected onInputChange(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n // A template `a?.b` binding yields `undefined` since Angular 22 (it was `null`). Either one means no minimum.\n const minCharacters = this.minCharactersSearch() ?? 0;\n this.filterService.search(text, minCharacters);\n if (text.length >= minCharacters) {\n this.searchTextChange.emit(text);\n }\n }\n\n protected onClear(): void {\n this.inputValue.set('');\n this.valueManager.clear();\n this.userAddedItems.set([]);\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.tagsBelow() ? '' : 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\n #formField\n class=\"input-container\"\n [class.has-multiple-selections]=\"\n type() === autocompleteType.LARGE &&\n utils.isArray(valueManager.value()) &&\n $any(valueManager.value()).length > 1\n \"\n [class.autocomplete-variant]=\"type() === autocompleteType.LARGE && !isDropdown\"\n >\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 [attr.data-testid]=\"testId() ?? 'autocomplete-v2-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]=\"suppressPlaceholder() ? '' : placeholder()\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"panelPosition()\"\n (input)=\"onInputChange($event)\"\n [ngModel]=\"inputValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"inputValue.set($event)\"\n />\n <!-- Hidden measurement container: always in DOM, renders ALL tags for width measurement -->\n @if (!tagsBelow() && type() !== autocompleteType.SINGLE && utils.isArray(valueManager.value())) {\n <div class=\"selected-items measurement-container\" #measureEl>\n @for (valueItem of $any(valueManager.value()); track valueItem[valueField()] || i; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'measure-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [allowClose]=\"true\"\n [isDisabled]=\"disabled()\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-tag>\n }\n </div>\n }\n\n @if (\n !tagsBelow() &&\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]=\"$safeNavigationMigration(measureElRef?.nativeElement)\"\n [class.measured]=\"\n type() === autocompleteType.LARGE || type() === autocompleteType.SINGLE || overflow.hasMeasured()\n \"\n >\n @if (size() === 'small' && $any(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[valueField()] || i; 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 [isDisabled]=\"disabled()\"\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\n [applicationTheme]=\"applicationTheme\"\n [isDisabled]=\"disabled()\"\n [label]=\"'+' + overflow.overflowCount()\"\n ></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 <ng-template #optionContentTpl let-item=\"item\" let-highlight=\"highlight\">\n @if (imageField() && item?.[imageField()]) {\n <img class=\"option-image\" [src]=\"item[imageField()]\" alt=\"\" />\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 </ng-template>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: highlight }\"\n ></ng-container>\n </mat-option>\n </ng-template>\n\n <!-- Reusable \"Add\"/no-results/loading option for the filtered view -->\n <ng-template #addOptionTpl let-items=\"items\" let-suggestions=\"suggestions\">\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 (\n allowAdd() && !isAlreadyAdded() && !utils.hasExactMatch(items, suggestions, inputValue(), textField())\n ) {\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 (!items.length && !suggestions.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ translationContext + 'NO_RESULTS_FOUND' | uiTranslate | async }}</span>\n </mat-option>\n }\n }\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 && !hideSelectedSection()) {\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 && !hideSelectedSection()) {\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 @if (userAdditionsGroupLabel() && userAddedItems().length) {\n <mat-optgroup [label]=\"userAdditionsGroupLabel()\">\n @for (item of userAddedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: { item: item, highlight: true }\"></ng-container>\n }\n </mat-optgroup>\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 @if (addOptionPosition() === 'top') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (addOptionPosition() === 'bottom') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n @if (addOptionPosition() === 'top') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 @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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\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 <ng-container\n *ngTemplateOutlet=\"optionContentTpl; context: { item: item, highlight: true }\"\n ></ng-container>\n </mat-option>\n }\n </mat-optgroup>\n }\n }\n\n @if (addOptionPosition() === 'bottom') {\n <ng-container\n *ngTemplateOutlet=\"\n addOptionTpl;\n context: { items: filteredItemsList, suggestions: filteredSuggestionList }\n \"\n ></ng-container>\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 @if (tagsBelow() && valueManager.value()?.length) {\n <div class=\"selected-items--below\">\n @for (valueItem of $any(valueManager.value()); track valueItem[valueField()] || i; let i = $index) {\n <ui-tag\n class=\"value-tag\"\n [id]=\"'below-tag-' + i\"\n [label]=\"valueItem | transformItem: textField()\"\n [icon]=\"tagIcons()[i]\"\n [allowClose]=\"true\"\n [isDisabled]=\"disabled()\"\n [constrainWidth]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n (close)=\"onOptionRemoved(valueItem)\"\n (click)=\"onTagActivate($event)\"\n (keydown.enter)=\"onTagActivate($event)\"\n (keydown.space)=\"onTagActivate($event)\"\n >\n @if (tagSuffix(); as suffix) {\n <span class=\"value-tag__suffix\" uiTagSuffix>\n <ng-container *ngTemplateOutlet=\"suffix.templateRef; context: { $implicit: valueItem, index: i }\" />\n </span>\n }\n </ui-tag>\n }\n <!-- Consumer content rendered as a sibling of the selected tags, before the clear button -->\n <ng-content select=\"[autocompleteTagsSuffix]\"></ng-content>\n @if (clearable()) {\n <button type=\"button\" class=\"clear-all\" [disabled]=\"_isDisabled()\" (click)=\"onClear()\">\n {{ 'COMMON.CLEAR' | uiTranslate | async }}\n </button>\n }\n </div>\n }\n </div>\n</ng-container>\n"],"mappings":"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"}
|
|
@@ -428,7 +428,7 @@ var AutocompleteComponent = class AutocompleteComponent {
|
|
|
428
428
|
onInputChange(event) {
|
|
429
429
|
const inputValue = event.target.value;
|
|
430
430
|
this.userInput$.next(inputValue);
|
|
431
|
-
if (inputValue.length >= this.minCharactersSearch) {
|
|
431
|
+
if (inputValue.length >= (this.minCharactersSearch ?? 0)) {
|
|
432
432
|
this.inputValueSearch$.next(inputValue);
|
|
433
433
|
this.searchTextChange.emit(inputValue);
|
|
434
434
|
const itemList = this.isGrouped ? this.itemsList.flatMap((groups) => groups.items) : this.itemsList.flat();
|