ngx-virtual-select-field-filterable 1.4.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-virtual-select-field-filterable.mjs","sources":["../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field-option-for/virtual-select-field-option-for.directive.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field-trigger/virtual-select-field-trigger.directive.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field-option/virtual-select-field-option.models.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field-option/virtual-select-field-option.component.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field-option/virtual-select-field-option.component.html","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field.constants.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/keycodes.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field.component.ts","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/virtual-select-field.component.html","../../../../packages/ngx-virtual-select-field/src/lib/virtual-select-field/index.ts","../../../../packages/ngx-virtual-select-field/src/ngx-virtual-select-field-filterable.ts"],"sourcesContent":["import { Directive, Input, TemplateRef } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport {\n NgxVirtualSelectFieldOptionModel,\n NgxVirtualSelectFieldOptionTemplateContextModel,\n} from './virtual-select-field-option-for.models';\n\n@Directive({\n selector: '[ngxVirtualSelectFieldOptionFor]',\n standalone: true,\n})\nexport class NgxVirtualSelectFieldOptionForDirective<TValue> {\n /**\n * The options collection to render.\n * @required\n */\n @Input({ required: true, alias: 'ngxVirtualSelectFieldOptionForOf' })\n set options(options: NgxVirtualSelectFieldOptionModel<TValue>[]) {\n this.options$.next(options);\n }\n\n options$ = new BehaviorSubject<NgxVirtualSelectFieldOptionModel<TValue>[]>(\n []\n );\n\n constructor(\n public template: TemplateRef<\n NgxVirtualSelectFieldOptionTemplateContextModel<TValue>\n >\n ) {}\n\n static ngTemplateContextGuard<TValue>(\n _dir: NgxVirtualSelectFieldOptionForDirective<TValue>,\n ctx: unknown\n ): ctx is NgxVirtualSelectFieldOptionTemplateContextModel<TValue> {\n return true;\n }\n}\n","import { Directive, InjectionToken } from '@angular/core';\n\nexport const NGX_VIRTUAL_SELECT_FIELD_TRIGGER =\n new InjectionToken<NgxVirtualSelectFieldTriggerDirective>(\n 'NGX_VIRTUAL_SELECT_FIELD_TRIGGER'\n );\n\n@Directive({\n selector: 'ngx-virtual-select-field-trigger',\n providers: [\n {\n provide: NGX_VIRTUAL_SELECT_FIELD_TRIGGER,\n useExisting: NgxVirtualSelectFieldTriggerDirective,\n },\n ],\n standalone: true,\n})\nexport class NgxVirtualSelectFieldTriggerDirective {}\n","import { InjectionToken } from '@angular/core';\n\nexport interface NgxVirtualSelectFieldOptionParent {\n multiple?: boolean;\n}\n\nexport const NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT =\n new InjectionToken<NgxVirtualSelectFieldOptionParent>(\n 'NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT'\n );\n","import {\n Component,\n Input,\n Inject,\n ChangeDetectionStrategy,\n EventEmitter,\n Output,\n signal,\n booleanAttribute,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n MatPseudoCheckboxModule,\n MatRippleModule,\n} from '@angular/material/core';\n\nimport {\n NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT,\n NgxVirtualSelectFieldOptionParent,\n} from './virtual-select-field-option.models';\nimport { Highlightable } from '@angular/cdk/a11y';\n\n@Component({\n selector: 'ngx-virtual-select-field-option',\n standalone: true,\n imports: [CommonModule, MatPseudoCheckboxModule, MatRippleModule],\n templateUrl: './virtual-select-field-option.component.html',\n styleUrl: './virtual-select-field-option.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'option',\n '(click)': 'onClick()',\n '[class.ngx-virtual-select-field-option--active]': 'active()',\n '[class.ngx-virtual-select-field-option--selected]': 'selected()',\n '[class.ngx-virtual-select-field-option--multiple]': 'multiple',\n '[class.ngx-virtual-select-field-option--disabled]': 'disabled',\n class: 'ngx-virtual-select-field-option',\n },\n})\nexport class NgxVirtualSelectFieldOptionComponent<TValue>\n implements Highlightable\n{\n /**\n * The value of the option.\n * @required\n */\n @Input({ required: true })\n value!: TValue;\n\n /**\n * Whether the option is disabled.\n */\n @Input({ transform: booleanAttribute })\n disabled: boolean = false;\n\n @Output()\n selectedChange = new EventEmitter<\n NgxVirtualSelectFieldOptionSelectionChangeEvent<TValue>\n >();\n\n protected readonly multiple = this._optionParent?.multiple ?? false;\n\n protected readonly active = signal(false);\n\n protected readonly selected = signal(false);\n\n protected readonly hostNativeElement: HTMLElement;\n\n constructor(\n @Inject(NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT)\n private _optionParent: NgxVirtualSelectFieldOptionParent,\n private _elementRef: ElementRef<HTMLElement>\n ) {\n this.hostNativeElement = this._elementRef.nativeElement;\n }\n\n // #region Highlightable\n\n setActiveStyles(): void {\n if (!this.active()) {\n this.active.set(true);\n }\n }\n\n setInactiveStyles(): void {\n if (this.active()) {\n this.active.set(false);\n }\n }\n\n // #endregion Highlightable\n\n deselect() {\n this.selected.set(false);\n }\n\n select() {\n this.selected.set(true);\n }\n\n protected onClick() {\n if (this.disabled) {\n return;\n }\n\n this.selected.set(this.multiple ? !this.selected() : true);\n\n this.selectedChange.emit({\n source: this,\n value: this.value,\n selected: this.selected(),\n });\n }\n}\n\nexport interface NgxVirtualSelectFieldOptionSelectionChangeEvent<TValue> {\n source: NgxVirtualSelectFieldOptionComponent<TValue>;\n value: TValue;\n selected: boolean;\n}\n","@if(multiple){\n<mat-pseudo-checkbox\n [state]=\"selected() ? 'checked' : 'unchecked'\"\n></mat-pseudo-checkbox>\n}\n\n<span class=\"ngx-virtual-select-field-option__label\"\n ><ng-content></ng-content\n></span>\n\n@if (!multiple && selected() ) {\n<mat-pseudo-checkbox state=\"checked\" appearance=\"minimal\"></mat-pseudo-checkbox>\n}\n\n<div\n class=\"ngx-virtual-select-field-option__ripple\"\n matRipple\n [matRippleTrigger]=\"hostNativeElement\"\n [matRippleDisabled]=\"disabled\"\n></div>\n","import { ConnectedPosition } from '@angular/cdk/overlay';\nimport { InjectionToken } from '@angular/core';\n\nimport { NgxVirtualSelectFieldConfig } from './virtual-select-field.models';\n\nexport const POSITIONS: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n panelClass: 'ngx-virtual-select-field-overlay--above',\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n panelClass: 'ngx-virtual-select-field-overlay--above',\n },\n];\n\nexport const NGX_VIRTUAL_SELECT_FIELD_CONFIG = new InjectionToken<NgxVirtualSelectFieldConfig>(\n 'NGX_VIRTUAL_SELECT_FIELD_CONFIG'\n);\n\nexport const PANEL_WIDTH_AUTO = 'auto';\n\nexport const PANEL_VIEWPORT_PAGE_SIZE = 8;\n\nexport const OPTION_HEIGHT = 48;\n","export const ARROW_DOWN_KEY = 'ArrowDown';\n\nexport const ARROW_UP_KEY = 'ArrowUp';\n\nexport const ARROW_RIGHT_KEY = 'ArrowRight';\n\nexport const ARROW_LEFT_KEY = 'ArrowLeft';\n\nexport const ENTER_CODE = 'Enter';\n\nexport const SPACE_CODE = 'Space';\n\nexport const KEY_A_CODE = 'KeyA';\n","//#region imports\n\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n DestroyRef,\n ElementRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n QueryList,\n Signal,\n TrackByFunction,\n ViewChild,\n booleanAttribute,\n computed,\n inject,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { ListKeyManager } from '@angular/cdk/a11y';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n OverlayModule,\n ViewportRuler,\n} from '@angular/cdk/overlay';\nimport {\n CdkVirtualScrollViewport,\n ScrollingModule,\n} from '@angular/cdk/scrolling';\nimport {\n MAT_FORM_FIELD,\n MatFormField,\n MatFormFieldControl,\n MatFormFieldModule,\n} from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport {\n Observable,\n Subject,\n debounceTime,\n map,\n merge,\n startWith,\n switchMap,\n take,\n tap,\n} from 'rxjs';\n\nimport {\n NgxVirtualSelectFieldOptionForDirective,\n NgxVirtualSelectFieldOptionModel,\n} from './virtual-select-field-option-for';\nimport {\n NGX_VIRTUAL_SELECT_FIELD_TRIGGER,\n NgxVirtualSelectFieldTriggerDirective,\n} from './virtual-select-field-trigger';\nimport {\n NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT,\n NgxVirtualSelectFieldOptionComponent,\n NgxVirtualSelectFieldOptionParent,\n NgxVirtualSelectFieldOptionSelectionChangeEvent,\n} from './virtual-select-field-option';\n\nimport {\n OPTION_HEIGHT,\n PANEL_WIDTH_AUTO,\n POSITIONS,\n PANEL_VIEWPORT_PAGE_SIZE,\n NGX_VIRTUAL_SELECT_FIELD_CONFIG,\n} from './virtual-select-field.constants';\nimport { NgxVirtualSelectFieldConfig } from './virtual-select-field.models';\nimport {\n ARROW_DOWN_KEY,\n ARROW_LEFT_KEY,\n ARROW_RIGHT_KEY,\n ARROW_UP_KEY,\n ENTER_CODE,\n KEY_A_CODE,\n SPACE_CODE,\n} from './keycodes';\n\n//#endregion imports\n\n@Component({\n selector: 'ngx-virtual-select-field',\n exportAs: 'ngxVirtualSelectField',\n standalone: true,\n imports: [CommonModule, OverlayModule, ScrollingModule, MatFormFieldModule, MatInputModule],\n templateUrl: './virtual-select-field.component.html',\n styleUrl: './virtual-select-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: MatFormFieldControl,\n useExisting: NgxVirtualSelectFieldComponent,\n },\n {\n provide: NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT,\n useExisting: NgxVirtualSelectFieldComponent,\n },\n ],\n host: {\n '[attr.tabindex]': 'this.disabled ? -1 : tabIndex',\n '(focus)': 'onFocusIn()',\n '(blur)': 'onFocusOut()',\n '(keydown)': 'onKeyDown($event)',\n class: 'ngx-virtual-select-field',\n '[class.ngx-virtual-select-field-disabled]': 'disabled',\n '[class.ngx-virtual-select-field-invalid]': 'errorState',\n },\n})\nexport class NgxVirtualSelectFieldComponent<TValue>\n implements\n OnInit,\n OnDestroy,\n AfterContentInit,\n MatFormFieldControl<TValue[] | TValue>,\n ControlValueAccessor,\n NgxVirtualSelectFieldOptionParent\n{\n //#region Inputs/Outputs\n\n @Input('aria-describedby')\n userAriaDescribedBy = '';\n\n /**\n * Width for overlay panel\n * @default 'auto'\n */\n @Input()\n panelWidth: string | number | null =\n this._defaultOptions?.panelWidth ?? PANEL_WIDTH_AUTO;\n\n /**\n * Height for an option element\n * @default 48\n */\n @Input({\n transform: (value: unknown) => numberAttribute(value, OPTION_HEIGHT),\n })\n optionHeight: number = this._defaultOptions?.optionHeight ?? OPTION_HEIGHT;\n\n /**\n * Amount of visible items in list\n * @default 8\n */\n @Input({\n transform: (value: unknown) =>\n numberAttribute(value, PANEL_VIEWPORT_PAGE_SIZE),\n })\n panelViewportPageSize: number =\n this._defaultOptions?.panelViewportPageSize ?? PANEL_VIEWPORT_PAGE_SIZE;\n\n /**\n * Enable multiple selection\n * @default false\n */\n @Input({ transform: booleanAttribute })\n multiple: boolean = false;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n @Input({\n transform: (value: unknown) => numberAttribute(value, 0),\n })\n tabIndex: number = 0;\n\n /**\n * Milliseconds to wait before navigating to active element after keyboard search\n * @default 300\n */\n @Input({ transform: numberAttribute })\n typeaheadDebounceInterval: number = 300;\n\n /**\n * CSS class to be added to the panel element\n * @default none\n */\n @Input()\n panelClass: string | string[] | null = null;\n\n /**\n * Enable filtering of options\n * @default false\n */\n @Input({ transform: booleanAttribute })\n filterable: boolean = false;\n\n /**\n * Placeholder text for the filter input\n * @default 'Search...'\n */\n @Input()\n filterPlaceholder: string = 'Search...';\n\n /**\n * Value of the select field\n * @default null\n */\n @Input()\n set value(value: TValue[] | TValue | null) {\n if (this._value === value) {\n return;\n }\n\n value = value || [];\n\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n this._value = value;\n\n this._selectionModel?.setSelection(\n ...this._value.map(\n (v) => this.optionFor.options$.value.find((o) => o.value === v)!,\n ),\n );\n\n this._stateChanges.next();\n }\n private _value: TValue[] = [];\n\n /**\n * Placeholder for the select field\n * @default none\n */\n @Input()\n set placeholder(placeholder: string) {\n this._placeholder = placeholder;\n this._stateChanges.next();\n }\n\n get placeholder(): string {\n return this._placeholder;\n }\n\n private _placeholder = '';\n\n /**\n * Define if fields is required\n * @default false\n */\n @Input({ transform: booleanAttribute })\n set required(req: boolean) {\n this._required = req;\n this._stateChanges.next();\n }\n\n get required(): boolean {\n return this._required;\n }\n\n private _required = false;\n\n /**\n * Define if field is disabled\n * @default false\n */\n @Input({ transform: booleanAttribute })\n set disabled(value: boolean) {\n this._disabled = value;\n this._stateChanges.next();\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n private _disabled = false;\n\n /**\n * Value change event\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n valueChange = output<any>();\n\n /**\n * Selection change event\n * Emits after value change and form control update\n */\n selectionChange = output<NgxVirtualSelectFieldChange<TValue>>();\n\n //#endregion Inputs/Outputs\n\n @ViewChild(CdkVirtualScrollViewport, { static: false })\n cdkVirtualScrollViewport!: CdkVirtualScrollViewport;\n\n @ViewChild(CdkConnectedOverlay, { static: false })\n cdkConnectedOverlay!: CdkConnectedOverlay;\n\n @ViewChild('filterInput', { static: false })\n filterInput: ElementRef<HTMLInputElement> | undefined;\n\n @ContentChild(NgxVirtualSelectFieldOptionForDirective)\n optionFor!: NgxVirtualSelectFieldOptionForDirective<TValue>;\n\n @ContentChild(NGX_VIRTUAL_SELECT_FIELD_TRIGGER)\n customTrigger: NgxVirtualSelectFieldTriggerDirective | null = null;\n\n @ContentChildren(NgxVirtualSelectFieldOptionComponent)\n optionsQuery: QueryList<NgxVirtualSelectFieldOptionComponent<TValue>> | null =\n null;\n\n readonly id = `ngx-virtual-select-field-${NgxVirtualSelectFieldComponent.nextId++}`;\n readonly controlType = 'ngx-virtual-select-field';\n readonly ngControl: NgControl | null = inject(NgControl, {\n optional: true,\n });\n autofilled = false;\n\n protected readonly POSITIONS = POSITIONS;\n protected readonly overlayPanelClass: string | string[] =\n this._defaultOptions?.overlayPanelClass || '';\n protected readonly inheritedColorTheme: string;\n protected readonly overlayWidth: Signal<string | number>;\n\n protected readonly isPanelOpened = signal(false);\n protected readonly filterText = signal('');\n protected triggerValue$: Observable<string> | null = null;\n protected filteredOptions$: Observable<NgxVirtualSelectFieldOptionModel<TValue>[]> | null = null;\n protected preferredOverlayOrigin: CdkOverlayOrigin | ElementRef | undefined;\n\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _elRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _stateChanges = new Subject<void>();\n private readonly _scrolledIndexChange = new Subject<void>();\n\n private _onChange: (value: TValue[] | TValue) => void = () => void 0;\n private _onTouched: () => void = () => void 0;\n\n private _selectionModel!: SelectionModel<\n NgxVirtualSelectFieldOptionModel<TValue>\n >;\n private _keyManager: ListKeyManager<\n NgxVirtualSelectFieldOptionModel<TValue>\n > | null = null;\n private _filterTextSubject: Subject<string> | null = null;\n\n constructor(\n @Optional()\n @Inject(MAT_FORM_FIELD)\n private _parentFormField: MatFormField,\n @Optional()\n @Inject(NGX_VIRTUAL_SELECT_FIELD_CONFIG)\n private _defaultOptions?: NgxVirtualSelectFieldConfig,\n ) {\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n this._disabled = this.ngControl.disabled ?? false;\n }\n\n this.overlayWidth = this.createOverlayWidthSignal();\n\n this.inheritedColorTheme = this._parentFormField\n ? `mat-${this._parentFormField.color}`\n : '';\n }\n\n private createOverlayWidthSignal() {\n const changeDetectorRef = inject(ChangeDetectorRef);\n\n // NOTE: View port ruler change stream runs outside the zone.\n // Need to run change detection manually to trigger computed signal below.\n const viewPortRulerChange = toSignal(\n inject(ViewportRuler)\n .change()\n .pipe(\n takeUntilDestroyed(this._destroyRef),\n tap(() => changeDetectorRef.detectChanges()),\n ),\n );\n\n return computed(() => {\n viewPortRulerChange();\n\n return this.resolveOverlayWidth(this.preferredOverlayOrigin);\n });\n }\n\n private resolveOverlayWidth(\n preferredOrigin: ElementRef<ElementRef> | CdkOverlayOrigin | undefined,\n ): string | number {\n if (!this.isPanelOpened()) {\n return 0;\n }\n\n if (this.panelWidth !== PANEL_WIDTH_AUTO) {\n return this.panelWidth ?? '';\n }\n\n const refToMeasure =\n preferredOrigin instanceof CdkOverlayOrigin\n ? preferredOrigin.elementRef\n : preferredOrigin || this._elRef;\n\n return refToMeasure.nativeElement.getBoundingClientRect().width;\n }\n\n get shouldLabelFloat() {\n return this.focused || !this.empty;\n }\n\n get empty() {\n return !this._selectionModel || this._selectionModel.isEmpty();\n }\n\n get stateChanges(): Observable<void> {\n return this._stateChanges.asObservable();\n }\n\n get errorState(): boolean {\n return !!this.ngControl?.invalid && !!this.ngControl?.touched;\n }\n\n get focused(): boolean {\n // NOTE: panel open is needed to keep form field in focused state during interaction with options\n return this._focused || this.isPanelOpened();\n }\n private _focused = false;\n\n protected get maxPageSize(): number {\n return Math.min(\n this.panelViewportPageSize,\n this.optionFor.options$.value.length,\n );\n }\n\n ngOnInit() {\n this._selectionModel = new SelectionModel<\n NgxVirtualSelectFieldOptionModel<TValue>\n >(this.multiple, [], true);\n }\n\n ngAfterContentInit() {\n this.assertIsDefined(this.optionsQuery, `optionsQuery is not defined`);\n\n if (!this.customTrigger) {\n this.triggerValue$ = this._selectionModel.changed.pipe(\n startWith(null),\n map((_selected) =>\n this._selectionModel.selected\n .map((option) => option?.label ?? '')\n .join(', '),\n ),\n );\n }\n\n // Create filtered options observable that reacts to filter text changes\n const filterText$ = new Subject<string>();\n\n this.filteredOptions$ = merge(\n this.optionFor.options$,\n filterText$.pipe(switchMap(() => this.optionFor.options$))\n ).pipe(\n map((options) => {\n const searchText = this.filterText().toLowerCase().trim();\n if (!searchText || !this.filterable) {\n return options;\n }\n return options.filter((option) => {\n const label = option.getLabel?.() ?? option.label;\n return label.toLowerCase().includes(searchText);\n });\n }),\n );\n\n // Trigger filter updates when filter text changes\n this._filterTextSubject = filterText$;\n\n this.optionFor.options$\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((options) => {\n this._selectionModel?.setSelection(\n ...this._value.map((v) => options.find((o) => o.value === v)!),\n );\n this.initListKeyManager(options);\n });\n\n this.optionsQuery.changes\n .pipe(\n switchMap(() =>\n merge(...this.optionsQuery!.map((option) => option.selectedChange)),\n ),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe((selectionEvent) =>\n this.updateOptionSelection(\n selectionEvent,\n this.optionFor.options$.value,\n ),\n );\n\n merge(this._scrolledIndexChange, this._selectionModel.changed)\n .pipe(takeUntilDestroyed(this._destroyRef), debounceTime(20))\n .subscribe(() =>\n this.updateRenderedOptionsState(this.optionFor.options$.value),\n );\n }\n\n private updateOptionSelection(\n selectionEvent: NgxVirtualSelectFieldOptionSelectionChangeEvent<TValue>,\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n ) {\n this.assertIsDefined(this.optionsQuery, `optionsQuery is not defined`);\n\n const { option: changedOption, index: selectedIndex } =\n this.findOptionByValue(options, selectionEvent.value);\n\n if (this.multiple) {\n this._selectionModel.toggle(changedOption);\n } else if (changedOption.value === null) {\n this._selectionModel.clear();\n\n this.close();\n } else {\n this._selectionModel.select(changedOption);\n\n this.close();\n }\n\n if (this._selectionModel.isSelected(changedOption)) {\n this._keyManager?.setActiveItem(selectedIndex);\n }\n\n // NOTE: this need to keep form field in focus state\n this.focus();\n this.emitValue();\n }\n\n ngOnDestroy() {\n this._scrolledIndexChange.complete();\n this._keyManager?.destroy();\n this._stateChanges.complete();\n }\n\n // #region ControlValueAccessor\n\n writeValue(value: TValue[]): void {\n this.value = value;\n\n // after settting a value on empty fornControl local `empty` does not update\n // as result the field continue to show placeholder.\n // needed to trigger change detection for the empty state and trigger value updates\n this._changeDetectorRef.markForCheck();\n }\n\n registerOnChange(fn: (value: TValue[] | TValue) => void) {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // #endregion ControlValueAccessor\n\n setDescribedByIds(ids: string[]) {\n const controlElement = this._elRef.nativeElement;\n\n controlElement.setAttribute('aria-describedby', ids.join(' '));\n }\n\n onContainerClick(): void {\n if (this.disabled) {\n return;\n }\n\n this.focus();\n this.open();\n }\n\n onOverlayAttached() {\n this.cdkConnectedOverlay.positionChange\n .pipe(\n take(1),\n switchMap(() => this._scrolledIndexChange.pipe(take(1))),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe(() => this.navigateToFirstSelectedOption());\n }\n\n private navigateToFirstSelectedOption() {\n if (this._selectionModel.isEmpty()) {\n return;\n }\n\n let targetIndex = this.optionFor.options$.value.findIndex(\n (option) => option === this._selectionModel.selected[0],\n );\n\n targetIndex = targetIndex - this.maxPageSize / 2;\n targetIndex = Math.max(0, targetIndex);\n\n this.cdkVirtualScrollViewport.scrollToIndex(targetIndex);\n }\n\n protected onFocusIn() {\n if (!this.focused) {\n this._focused = true;\n this._stateChanges.next();\n }\n }\n\n protected onFocusOut() {\n this._focused = false;\n\n if (!this.isPanelOpened()) {\n this._onTouched();\n this._stateChanges.next();\n }\n }\n\n protected optionTrackBy: TrackByFunction<\n NgxVirtualSelectFieldOptionModel<TValue>\n > = (_index: number, option) => {\n return option.value;\n };\n\n protected onScrolledIndexChange(): void {\n this._scrolledIndexChange.next();\n }\n\n protected onFilterInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.filterText.set(input.value);\n this._filterTextSubject?.next(input.value);\n }\n\n protected onFilterKeyDown(event: KeyboardEvent): void {\n const isArrowKey =\n event.key === ARROW_DOWN_KEY ||\n event.key === ARROW_UP_KEY ||\n event.key === ARROW_LEFT_KEY ||\n event.key === ARROW_RIGHT_KEY;\n\n // Prevent arrow keys from propagating when there's text in the input\n if (isArrowKey && this.filterText()) {\n if (event.key === ARROW_DOWN_KEY || event.key === ARROW_UP_KEY) {\n // Arrow down/up should move to the options list\n event.preventDefault();\n this.cdkVirtualScrollViewport.elementRef.nativeElement.focus();\n this._keyManager?.onKeydown(event);\n }\n // Left/Right arrows should work normally in the input for cursor movement\n return;\n }\n\n // Allow other keys like Escape, Enter to work\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n } else if (event.key === 'Tab') {\n // Tab should close the panel\n this.close();\n }\n }\n\n protected open() {\n if (this.isPanelOpened()) {\n return;\n }\n\n if (this._parentFormField) {\n this.preferredOverlayOrigin =\n this._parentFormField.getConnectedOverlayOrigin();\n }\n\n this.isPanelOpened.set(true);\n\n // Focus the filter input when panel opens if filterable is enabled\n if (this.filterable) {\n setTimeout(() => {\n this.filterInput?.nativeElement.focus();\n }, 0);\n }\n }\n\n protected close() {\n this.isPanelOpened.set(false);\n this.filterText.set(''); // Clear filter when closing\n this._onTouched();\n this._stateChanges.next();\n }\n\n //#region Keyboard navigation\n\n protected onKeyDown(event: KeyboardEvent) {\n if (this.disabled) {\n return;\n }\n\n if (this.isPanelOpened()) {\n this.doPanelOpenedKeydown(event);\n } else {\n this.doPanelClosedKeydown(event);\n }\n }\n\n private doPanelOpenedKeydown(event: KeyboardEvent) {\n this.assertIsDefined(this.optionsQuery, `optionsQuery is not defined`);\n\n const keyManager = this._keyManager!;\n const activeItem = keyManager.activeItem;\n const isTyping = keyManager.isTyping();\n const options = this.optionFor.options$.value;\n const isArrowKey =\n event.key === ARROW_DOWN_KEY || event.key === ARROW_UP_KEY;\n\n if (isArrowKey && event.altKey) {\n event.preventDefault();\n\n this.close();\n } else if (\n !isTyping &&\n (event.code === ENTER_CODE || event.code === SPACE_CODE) &&\n activeItem &&\n !hasModifierKey(event)\n ) {\n event.preventDefault();\n\n const { option } = this.findOptionByValue(options, activeItem.value);\n\n this._selectionModel.toggle(option);\n\n this.emitValue();\n } else if (\n !isTyping &&\n this.multiple &&\n event.code === KEY_A_CODE &&\n event.ctrlKey\n ) {\n event.preventDefault();\n\n this.toggleAllOptions(options);\n\n this.emitValue();\n } else {\n const previouslyFocusedIndex = keyManager.activeItemIndex;\n\n keyManager.onKeydown(event);\n\n if (\n this.multiple &&\n isArrowKey &&\n event.shiftKey &&\n keyManager.activeItem &&\n keyManager.activeItemIndex !== previouslyFocusedIndex\n ) {\n this.selectOptionByValue(options, keyManager.activeItem.value);\n }\n }\n }\n\n private toggleAllOptions(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n ) {\n const enabledOptionValues = options.filter((option) => !option.disabled);\n\n const hasDeselectedOptions =\n enabledOptionValues.length > this._selectionModel.selected.length;\n\n if (hasDeselectedOptions) {\n this._selectionModel.select(...enabledOptionValues);\n } else {\n this._selectionModel.clear();\n }\n }\n\n private doPanelClosedKeydown(event: KeyboardEvent): void {\n const keyManager = this._keyManager!;\n const isTyping = keyManager.isTyping();\n\n const isArrowKey =\n event.key === ARROW_DOWN_KEY ||\n event.key === ARROW_UP_KEY ||\n event.key === ARROW_RIGHT_KEY ||\n event.key === ARROW_LEFT_KEY;\n\n if (\n (!isTyping &&\n (event.code === SPACE_CODE || event.code === ENTER_CODE) &&\n !hasModifierKey(event)) ||\n ((this.multiple || event.altKey) && isArrowKey)\n ) {\n event.preventDefault(); // prevents the page from scrolling down when pressing space\n this.open();\n } else if (!this.multiple) {\n const previouslySelectedOptionIndex = keyManager.activeItemIndex;\n\n keyManager.onKeydown(event);\n const selectedOptionIndex = keyManager.activeItemIndex;\n\n if (\n selectedOptionIndex &&\n previouslySelectedOptionIndex !== selectedOptionIndex\n ) {\n //TODO: arrow navigation should start from selected options. Currently it starts from the first option\n this.selectOptionByValue(\n this.optionFor.options$.value,\n keyManager.activeItem!.value,\n );\n\n // TODO: Add live announcer\n // We set a duration on the live announcement, because we want the live element to be\n // cleared after a while so that users can't navigate to it using the arrow keys.\n // this._liveAnnouncer.announce((selectedOption as MatOption).viewValue, 10000);\n }\n }\n }\n\n //#endregion Keyboard navigation\n\n //#region Key manager\n\n private initListKeyManager(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n ) {\n this._keyManager?.destroy();\n\n this._keyManager = new ListKeyManager<\n NgxVirtualSelectFieldOptionModel<TValue>\n >(this.normalizeKeyManagerOptions(options))\n .withTypeAhead(this.typeaheadDebounceInterval)\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withPageUpDown()\n .withAllowedModifierKeys(['shiftKey']);\n\n this._keyManager.tabOut.subscribe(() => {\n if (!this.isPanelOpened()) {\n return;\n }\n\n if (this._keyManager?.activeItem) {\n this.selectOptionByValue(options, this._keyManager.activeItem.value);\n }\n\n this.focus();\n this.close();\n });\n\n this._keyManager.change.subscribe((index) => {\n this.assertIsDefined(this.optionsQuery, `optionsQuery is not defined`);\n\n this.updateActiveOptionComponent(\n this.optionsQuery.toArray(),\n options[index],\n index,\n );\n });\n }\n\n private normalizeKeyManagerOptions(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n ) {\n return options.map((option) => ({\n value: option.value,\n label: option.label,\n disabled: option.disabled ?? false,\n getLabel: () => option.getLabel?.() ?? option.label,\n }));\n }\n\n private updateActiveOptionComponent(\n optionComponents: NgxVirtualSelectFieldOptionComponent<TValue>[],\n activeOption: NgxVirtualSelectFieldOptionModel<TValue>,\n index: number,\n ) {\n optionComponents.forEach((option) => option.setInactiveStyles());\n\n const shouldScrollToActiveItem = this.shouldScrollToActiveItem(index);\n if (shouldScrollToActiveItem) {\n this.cdkVirtualScrollViewport.scrolledIndexChange\n .pipe(take(1))\n .subscribe(() => {\n this.assertIsDefined(\n this.optionsQuery,\n `optionsQuery is not defined`,\n );\n\n this.setActiveOptionComponentByValue(\n this.optionsQuery.toArray(),\n activeOption.value,\n );\n });\n\n this.cdkVirtualScrollViewport.scrollToIndex(index);\n } else {\n this.setActiveOptionComponentByValue(\n optionComponents,\n activeOption.value,\n );\n }\n }\n\n private shouldScrollToActiveItem(targetIndex: number): boolean {\n if (!this.isPanelOpened()) {\n return false;\n }\n\n const scrollTop =\n this.cdkVirtualScrollViewport.elementRef.nativeElement.scrollTop;\n\n // NOTE: -1 is needed to prevent scrolling to next item out of the viewport\n const bottomScroll = scrollTop + this.optionHeight * this.maxPageSize - 1;\n const targetScroll = this.optionHeight * targetIndex;\n\n return scrollTop > targetScroll || bottomScroll < targetScroll;\n }\n\n private setActiveOptionComponentByValue(\n optionComponents: NgxVirtualSelectFieldOptionComponent<TValue>[],\n value: TValue,\n ) {\n const optionComponent = optionComponents.find(\n (option) => option.value === value,\n );\n\n this.assertIsDefined(\n optionComponent,\n `Option component with value ${value} not found`,\n );\n\n optionComponent.setActiveStyles();\n }\n\n // #endregion Key manager\n\n private focus() {\n this._elRef.nativeElement.focus();\n }\n\n private selectOptionByValue(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n value: TValue,\n ) {\n const { option } = this.findOptionByValue(options, value);\n\n this._selectionModel.select(option);\n\n this.emitValue();\n }\n\n private updateRenderedOptionsState(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n ) {\n this.assertIsDefined(this.optionsQuery, `optionsQuery is not defined`);\n\n this.optionsQuery.forEach((optionComponent) => {\n const { option } = this.findOptionByValue(options, optionComponent.value);\n\n if (this._selectionModel.isSelected(option)) {\n optionComponent.select();\n } else {\n // NOTE: deselect for all is needed because of virtual scroll and reusing options\n optionComponent.deselect();\n }\n });\n }\n\n private findOptionByValue(\n options: NgxVirtualSelectFieldOptionModel<TValue>[],\n value: TValue,\n ): { option: NgxVirtualSelectFieldOptionModel<TValue>; index: number } {\n const index = options.findIndex((option) => option.value === value);\n\n const option = options[index];\n\n this.assertIsDefined(option, `Option with value ${value} not found`);\n\n return { option, index };\n }\n\n private emitValue(): void {\n this._value = this._selectionModel.selected.map((option) => option.value);\n\n const outputValue = this.multiple ? this._value : this._value[0];\n\n this.valueChange.emit(outputValue);\n this._onChange(outputValue);\n this.selectionChange.emit(\n new NgxVirtualSelectFieldChange(this, outputValue),\n );\n }\n\n private assertIsDefined<T>(\n value: T,\n message: string,\n ): asserts value is NonNullable<T> {\n if (value === undefined || value === null) {\n throw new Error(message);\n }\n }\n\n private static nextId = 0;\n}\n\nexport class NgxVirtualSelectFieldChange<TValue> {\n constructor(\n public source: NgxVirtualSelectFieldComponent<TValue>,\n public value: any,\n ) {}\n}\n","<div\n class=\"ngx-virtual-select-field-trigger\"\n cdk-overlay-origin\n (click)=\"open()\"\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n>\n <div class=\"ngx-virtual-select-field-value\">\n @if (empty) {\n <span class=\"ngx-virtual-select-field-placeholder\">{{\n placeholder\n }}</span>\n } @else {\n <span>\n @if (customTrigger) {\n <ng-content select=\"ngx-virtual-select-field-trigger\"></ng-content>\n } @else {\n <span>{{ triggerValue$ | async }}</span>\n }\n </span>\n }\n </div>\n\n <div class=\"ngx-virtual-select-field-arrow-wrapper\">\n <div class=\"ngx-virtual-select-field-arrow\">\n <!-- Use an inline SVG, because it works better than a CSS triangle in high contrast mode. -->\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n focusable=\"false\"\n aria-hidden=\"true\"\n >\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n </div>\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"isPanelOpened()\"\n [cdkConnectedOverlayOrigin]=\"preferredOverlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPositions]=\"POSITIONS\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n (attach)=\"onOverlayAttached()\"\n>\n <!--\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"_getPanelAriaLabelledby()\"\n [@transformPanel]=\"'showing'\"\n (@transformPanel.done)=\"_panelDoneAnimatingStream.next($event.toState)\"\n -->\n <div class=\"ngx-virtual-select-field-panel {{ inheritedColorTheme }}\" [ngClass]=\"panelClass\">\n @if (filterable) {\n <div class=\"ngx-virtual-select-field-filter-wrapper\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"ngx-virtual-select-field-filter-field\">\n <input\n matInput\n #filterInput\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"filterText()\"\n (input)=\"onFilterInput($event)\"\n (keydown)=\"onFilterKeyDown($event)\"\n />\n </mat-form-field>\n </div>\n }\n <cdk-virtual-scroll-viewport\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"ngx-virtual-select-field-viewport\"\n [style.--ngx-virtual-select-field__viewport-page-size]=\"maxPageSize\"\n [style.--ngx-virtual-select-field__viewport-option-height.px]=\"optionHeight\"\n [itemSize]=\"optionHeight\"\n (scrolledIndexChange)=\"onScrolledIndexChange()\"\n (keydown)=\"onKeyDown($event)\"\n >\n <div class=\"ngx-virtual-select-field-list-wrapper\">\n <ng-container\n *cdkVirtualFor=\"\n let option of filteredOptions$ | async;\n trackBy: optionTrackBy\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"optionFor.template\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n >\n </ng-container>\n </ng-container>\n </div>\n </cdk-virtual-scroll-viewport>\n </div>\n</ng-template>\n","import { NgxVirtualSelectFieldOptionForDirective } from './virtual-select-field-option-for';\n\nimport { NgxVirtualSelectFieldComponent } from './virtual-select-field.component';\n\nimport { NgxVirtualSelectFieldTriggerDirective } from './virtual-select-field-trigger';\n\nimport { NgxVirtualSelectFieldOptionComponent } from './virtual-select-field-option';\n\nexport {\n NgxVirtualSelectFieldOptionForDirective,\n NgxVirtualSelectFieldOptionModel,\n} from './virtual-select-field-option-for';\n\nexport {\n NgxVirtualSelectFieldComponent,\n NgxVirtualSelectFieldChange,\n} from './virtual-select-field.component';\n\nexport { NgxVirtualSelectFieldTriggerDirective } from './virtual-select-field-trigger';\n\nexport { NgxVirtualSelectFieldOptionComponent } from './virtual-select-field-option';\n\nexport { NGX_VIRTUAL_SELECT_FIELD_CONFIG } from './virtual-select-field.constants';\n\nexport const NgxVirtualSelectFieldBundle = [\n NgxVirtualSelectFieldComponent,\n NgxVirtualSelectFieldOptionForDirective,\n NgxVirtualSelectFieldTriggerDirective,\n NgxVirtualSelectFieldOptionComponent,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib/virtual-select-field';
@@ -0,0 +1,10 @@
1
+ import { NgxVirtualSelectFieldOptionForDirective } from './virtual-select-field-option-for';
2
+ import { NgxVirtualSelectFieldComponent } from './virtual-select-field.component';
3
+ import { NgxVirtualSelectFieldTriggerDirective } from './virtual-select-field-trigger';
4
+ import { NgxVirtualSelectFieldOptionComponent } from './virtual-select-field-option';
5
+ export { NgxVirtualSelectFieldOptionForDirective, NgxVirtualSelectFieldOptionModel, } from './virtual-select-field-option-for';
6
+ export { NgxVirtualSelectFieldComponent, NgxVirtualSelectFieldChange, } from './virtual-select-field.component';
7
+ export { NgxVirtualSelectFieldTriggerDirective } from './virtual-select-field-trigger';
8
+ export { NgxVirtualSelectFieldOptionComponent } from './virtual-select-field-option';
9
+ export { NGX_VIRTUAL_SELECT_FIELD_CONFIG } from './virtual-select-field.constants';
10
+ export declare const NgxVirtualSelectFieldBundle: readonly [typeof NgxVirtualSelectFieldComponent, typeof NgxVirtualSelectFieldOptionForDirective, typeof NgxVirtualSelectFieldTriggerDirective, typeof NgxVirtualSelectFieldOptionComponent];
@@ -0,0 +1,7 @@
1
+ export declare const ARROW_DOWN_KEY = "ArrowDown";
2
+ export declare const ARROW_UP_KEY = "ArrowUp";
3
+ export declare const ARROW_RIGHT_KEY = "ArrowRight";
4
+ export declare const ARROW_LEFT_KEY = "ArrowLeft";
5
+ export declare const ENTER_CODE = "Enter";
6
+ export declare const SPACE_CODE = "Space";
7
+ export declare const KEY_A_CODE = "KeyA";
@@ -0,0 +1,3 @@
1
+ export { NgxVirtualSelectFieldOptionComponent } from './virtual-select-field-option.component';
2
+ export { NgxVirtualSelectFieldOptionParent, NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT, } from './virtual-select-field-option.models';
3
+ export { NgxVirtualSelectFieldOptionSelectionChangeEvent } from './virtual-select-field-option.component';
@@ -0,0 +1,36 @@
1
+ import { EventEmitter, ElementRef } from '@angular/core';
2
+ import { NgxVirtualSelectFieldOptionParent } from './virtual-select-field-option.models';
3
+ import { Highlightable } from '@angular/cdk/a11y';
4
+ import * as i0 from "@angular/core";
5
+ export declare class NgxVirtualSelectFieldOptionComponent<TValue> implements Highlightable {
6
+ private _optionParent;
7
+ private _elementRef;
8
+ /**
9
+ * The value of the option.
10
+ * @required
11
+ */
12
+ value: TValue;
13
+ /**
14
+ * Whether the option is disabled.
15
+ */
16
+ disabled: boolean;
17
+ selectedChange: EventEmitter<NgxVirtualSelectFieldOptionSelectionChangeEvent<TValue>>;
18
+ protected readonly multiple: boolean;
19
+ protected readonly active: import("@angular/core").WritableSignal<boolean>;
20
+ protected readonly selected: import("@angular/core").WritableSignal<boolean>;
21
+ protected readonly hostNativeElement: HTMLElement;
22
+ constructor(_optionParent: NgxVirtualSelectFieldOptionParent, _elementRef: ElementRef<HTMLElement>);
23
+ setActiveStyles(): void;
24
+ setInactiveStyles(): void;
25
+ deselect(): void;
26
+ select(): void;
27
+ protected onClick(): void;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxVirtualSelectFieldOptionComponent<any>, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxVirtualSelectFieldOptionComponent<any>, "ngx-virtual-select-field-option", never, { "value": { "alias": "value"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "selectedChange": "selectedChange"; }, never, ["*"], true, never>;
30
+ static ngAcceptInputType_disabled: unknown;
31
+ }
32
+ export interface NgxVirtualSelectFieldOptionSelectionChangeEvent<TValue> {
33
+ source: NgxVirtualSelectFieldOptionComponent<TValue>;
34
+ value: TValue;
35
+ selected: boolean;
36
+ }
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export interface NgxVirtualSelectFieldOptionParent {
3
+ multiple?: boolean;
4
+ }
5
+ export declare const NGX_VIRTUAL_SELECT_FIELD_OPTION_PARENT: InjectionToken<NgxVirtualSelectFieldOptionParent>;
@@ -0,0 +1,2 @@
1
+ export { NgxVirtualSelectFieldOptionForDirective } from './virtual-select-field-option-for.directive';
2
+ export { NgxVirtualSelectFieldOptionModel } from './virtual-select-field-option-for.models';
@@ -0,0 +1,17 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { NgxVirtualSelectFieldOptionModel, NgxVirtualSelectFieldOptionTemplateContextModel } from './virtual-select-field-option-for.models';
4
+ import * as i0 from "@angular/core";
5
+ export declare class NgxVirtualSelectFieldOptionForDirective<TValue> {
6
+ template: TemplateRef<NgxVirtualSelectFieldOptionTemplateContextModel<TValue>>;
7
+ /**
8
+ * The options collection to render.
9
+ * @required
10
+ */
11
+ set options(options: NgxVirtualSelectFieldOptionModel<TValue>[]);
12
+ options$: BehaviorSubject<NgxVirtualSelectFieldOptionModel<TValue>[]>;
13
+ constructor(template: TemplateRef<NgxVirtualSelectFieldOptionTemplateContextModel<TValue>>);
14
+ static ngTemplateContextGuard<TValue>(_dir: NgxVirtualSelectFieldOptionForDirective<TValue>, ctx: unknown): ctx is NgxVirtualSelectFieldOptionTemplateContextModel<TValue>;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxVirtualSelectFieldOptionForDirective<any>, never>;
16
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxVirtualSelectFieldOptionForDirective<any>, "[ngxVirtualSelectFieldOptionFor]", never, { "options": { "alias": "ngxVirtualSelectFieldOptionForOf"; "required": true; }; }, {}, never, never, true, never>;
17
+ }
@@ -0,0 +1,14 @@
1
+ import { ListKeyManagerOption } from '@angular/cdk/a11y';
2
+ export interface NgxVirtualSelectFieldOptionModel<TValue> extends ListKeyManagerOption {
3
+ /**
4
+ * The visible text of the option.
5
+ */
6
+ label: string;
7
+ /**
8
+ * The value of the option.
9
+ */
10
+ value: TValue;
11
+ }
12
+ export interface NgxVirtualSelectFieldOptionTemplateContextModel<TValue> {
13
+ $implicit: NgxVirtualSelectFieldOptionModel<TValue>;
14
+ }
@@ -0,0 +1 @@
1
+ export { NgxVirtualSelectFieldTriggerDirective, NGX_VIRTUAL_SELECT_FIELD_TRIGGER, } from './virtual-select-field-trigger.directive';
@@ -0,0 +1,7 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare const NGX_VIRTUAL_SELECT_FIELD_TRIGGER: InjectionToken<NgxVirtualSelectFieldTriggerDirective>;
4
+ export declare class NgxVirtualSelectFieldTriggerDirective {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxVirtualSelectFieldTriggerDirective, never>;
6
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxVirtualSelectFieldTriggerDirective, "ngx-virtual-select-field-trigger", never, {}, {}, never, never, true, never>;
7
+ }
@@ -0,0 +1,187 @@
1
+ import { AfterContentInit, ElementRef, OnDestroy, OnInit, QueryList, Signal, TrackByFunction } from '@angular/core';
2
+ import { ControlValueAccessor, NgControl } from '@angular/forms';
3
+ import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
4
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
5
+ import { MatFormField, MatFormFieldControl } from '@angular/material/form-field';
6
+ import { Observable } from 'rxjs';
7
+ import { NgxVirtualSelectFieldOptionForDirective, NgxVirtualSelectFieldOptionModel } from './virtual-select-field-option-for';
8
+ import { NgxVirtualSelectFieldTriggerDirective } from './virtual-select-field-trigger';
9
+ import { NgxVirtualSelectFieldOptionComponent, NgxVirtualSelectFieldOptionParent } from './virtual-select-field-option';
10
+ import { NgxVirtualSelectFieldConfig } from './virtual-select-field.models';
11
+ import * as i0 from "@angular/core";
12
+ export declare class NgxVirtualSelectFieldComponent<TValue> implements OnInit, OnDestroy, AfterContentInit, MatFormFieldControl<TValue[] | TValue>, ControlValueAccessor, NgxVirtualSelectFieldOptionParent {
13
+ private _parentFormField;
14
+ private _defaultOptions?;
15
+ userAriaDescribedBy: string;
16
+ /**
17
+ * Width for overlay panel
18
+ * @default 'auto'
19
+ */
20
+ panelWidth: string | number | null;
21
+ /**
22
+ * Height for an option element
23
+ * @default 48
24
+ */
25
+ optionHeight: number;
26
+ /**
27
+ * Amount of visible items in list
28
+ * @default 8
29
+ */
30
+ panelViewportPageSize: number;
31
+ /**
32
+ * Enable multiple selection
33
+ * @default false
34
+ */
35
+ multiple: boolean;
36
+ /**
37
+ * Tab index for keyboard navigation
38
+ * @default 0
39
+ */
40
+ tabIndex: number;
41
+ /**
42
+ * Milliseconds to wait before navigating to active element after keyboard search
43
+ * @default 300
44
+ */
45
+ typeaheadDebounceInterval: number;
46
+ /**
47
+ * CSS class to be added to the panel element
48
+ * @default none
49
+ */
50
+ panelClass: string | string[] | null;
51
+ /**
52
+ * Enable filtering of options
53
+ * @default false
54
+ */
55
+ filterable: boolean;
56
+ /**
57
+ * Placeholder text for the filter input
58
+ * @default 'Search...'
59
+ */
60
+ filterPlaceholder: string;
61
+ /**
62
+ * Value of the select field
63
+ * @default null
64
+ */
65
+ set value(value: TValue[] | TValue | null);
66
+ private _value;
67
+ /**
68
+ * Placeholder for the select field
69
+ * @default none
70
+ */
71
+ set placeholder(placeholder: string);
72
+ get placeholder(): string;
73
+ private _placeholder;
74
+ /**
75
+ * Define if fields is required
76
+ * @default false
77
+ */
78
+ set required(req: boolean);
79
+ get required(): boolean;
80
+ private _required;
81
+ /**
82
+ * Define if field is disabled
83
+ * @default false
84
+ */
85
+ set disabled(value: boolean);
86
+ get disabled(): boolean;
87
+ private _disabled;
88
+ /**
89
+ * Value change event
90
+ */
91
+ valueChange: import("@angular/core").OutputEmitterRef<any>;
92
+ /**
93
+ * Selection change event
94
+ * Emits after value change and form control update
95
+ */
96
+ selectionChange: import("@angular/core").OutputEmitterRef<NgxVirtualSelectFieldChange<TValue>>;
97
+ cdkVirtualScrollViewport: CdkVirtualScrollViewport;
98
+ cdkConnectedOverlay: CdkConnectedOverlay;
99
+ filterInput: ElementRef<HTMLInputElement> | undefined;
100
+ optionFor: NgxVirtualSelectFieldOptionForDirective<TValue>;
101
+ customTrigger: NgxVirtualSelectFieldTriggerDirective | null;
102
+ optionsQuery: QueryList<NgxVirtualSelectFieldOptionComponent<TValue>> | null;
103
+ readonly id: string;
104
+ readonly controlType = "ngx-virtual-select-field";
105
+ readonly ngControl: NgControl | null;
106
+ autofilled: boolean;
107
+ protected readonly POSITIONS: import("@angular/cdk/overlay").ConnectedPosition[];
108
+ protected readonly overlayPanelClass: string | string[];
109
+ protected readonly inheritedColorTheme: string;
110
+ protected readonly overlayWidth: Signal<string | number>;
111
+ protected readonly isPanelOpened: import("@angular/core").WritableSignal<boolean>;
112
+ protected readonly filterText: import("@angular/core").WritableSignal<string>;
113
+ protected triggerValue$: Observable<string> | null;
114
+ protected filteredOptions$: Observable<NgxVirtualSelectFieldOptionModel<TValue>[]> | null;
115
+ protected preferredOverlayOrigin: CdkOverlayOrigin | ElementRef | undefined;
116
+ private readonly _changeDetectorRef;
117
+ private readonly _destroyRef;
118
+ private readonly _elRef;
119
+ private readonly _stateChanges;
120
+ private readonly _scrolledIndexChange;
121
+ private _onChange;
122
+ private _onTouched;
123
+ private _selectionModel;
124
+ private _keyManager;
125
+ private _filterTextSubject;
126
+ constructor(_parentFormField: MatFormField, _defaultOptions?: NgxVirtualSelectFieldConfig | undefined);
127
+ private createOverlayWidthSignal;
128
+ private resolveOverlayWidth;
129
+ get shouldLabelFloat(): boolean;
130
+ get empty(): boolean;
131
+ get stateChanges(): Observable<void>;
132
+ get errorState(): boolean;
133
+ get focused(): boolean;
134
+ private _focused;
135
+ protected get maxPageSize(): number;
136
+ ngOnInit(): void;
137
+ ngAfterContentInit(): void;
138
+ private updateOptionSelection;
139
+ ngOnDestroy(): void;
140
+ writeValue(value: TValue[]): void;
141
+ registerOnChange(fn: (value: TValue[] | TValue) => void): void;
142
+ registerOnTouched(fn: () => void): void;
143
+ setDisabledState(isDisabled: boolean): void;
144
+ setDescribedByIds(ids: string[]): void;
145
+ onContainerClick(): void;
146
+ onOverlayAttached(): void;
147
+ private navigateToFirstSelectedOption;
148
+ protected onFocusIn(): void;
149
+ protected onFocusOut(): void;
150
+ protected optionTrackBy: TrackByFunction<NgxVirtualSelectFieldOptionModel<TValue>>;
151
+ protected onScrolledIndexChange(): void;
152
+ protected onFilterInput(event: Event): void;
153
+ protected onFilterKeyDown(event: KeyboardEvent): void;
154
+ protected open(): void;
155
+ protected close(): void;
156
+ protected onKeyDown(event: KeyboardEvent): void;
157
+ private doPanelOpenedKeydown;
158
+ private toggleAllOptions;
159
+ private doPanelClosedKeydown;
160
+ private initListKeyManager;
161
+ private normalizeKeyManagerOptions;
162
+ private updateActiveOptionComponent;
163
+ private shouldScrollToActiveItem;
164
+ private setActiveOptionComponentByValue;
165
+ private focus;
166
+ private selectOptionByValue;
167
+ private updateRenderedOptionsState;
168
+ private findOptionByValue;
169
+ private emitValue;
170
+ private assertIsDefined;
171
+ private static nextId;
172
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxVirtualSelectFieldComponent<any>, [{ optional: true; }, { optional: true; }]>;
173
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxVirtualSelectFieldComponent<any>, "ngx-virtual-select-field", ["ngxVirtualSelectField"], { "userAriaDescribedBy": { "alias": "aria-describedby"; "required": false; }; "panelWidth": { "alias": "panelWidth"; "required": false; }; "optionHeight": { "alias": "optionHeight"; "required": false; }; "panelViewportPageSize": { "alias": "panelViewportPageSize"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "typeaheadDebounceInterval": { "alias": "typeaheadDebounceInterval"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; }; "filterable": { "alias": "filterable"; "required": false; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; "selectionChange": "selectionChange"; }, ["optionFor", "customTrigger", "optionsQuery"], ["ngx-virtual-select-field-trigger"], true, never>;
174
+ static ngAcceptInputType_optionHeight: unknown;
175
+ static ngAcceptInputType_panelViewportPageSize: unknown;
176
+ static ngAcceptInputType_multiple: unknown;
177
+ static ngAcceptInputType_tabIndex: unknown;
178
+ static ngAcceptInputType_typeaheadDebounceInterval: unknown;
179
+ static ngAcceptInputType_filterable: unknown;
180
+ static ngAcceptInputType_required: unknown;
181
+ static ngAcceptInputType_disabled: unknown;
182
+ }
183
+ export declare class NgxVirtualSelectFieldChange<TValue> {
184
+ source: NgxVirtualSelectFieldComponent<TValue>;
185
+ value: any;
186
+ constructor(source: NgxVirtualSelectFieldComponent<TValue>, value: any);
187
+ }
@@ -0,0 +1,8 @@
1
+ import { ConnectedPosition } from '@angular/cdk/overlay';
2
+ import { InjectionToken } from '@angular/core';
3
+ import { NgxVirtualSelectFieldConfig } from './virtual-select-field.models';
4
+ export declare const POSITIONS: ConnectedPosition[];
5
+ export declare const NGX_VIRTUAL_SELECT_FIELD_CONFIG: InjectionToken<NgxVirtualSelectFieldConfig>;
6
+ export declare const PANEL_WIDTH_AUTO = "auto";
7
+ export declare const PANEL_VIEWPORT_PAGE_SIZE = 8;
8
+ export declare const OPTION_HEIGHT = 48;
@@ -0,0 +1,18 @@
1
+ export interface NgxVirtualSelectFieldConfig {
2
+ /**
3
+ * CSS class to add to the overlay element
4
+ */
5
+ overlayPanelClass?: string | string[];
6
+ /**
7
+ * Width for overlay panel
8
+ */
9
+ panelWidth?: string | number;
10
+ /**
11
+ * Height for an option element
12
+ */
13
+ optionHeight?: number;
14
+ /**
15
+ * Amount of visible items in list
16
+ */
17
+ panelViewportPageSize?: number;
18
+ }
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "ngx-virtual-select-field-filterable",
3
+ "version": "1.4.0",
4
+ "description": "Virtual Select Field for Angular Material",
5
+ "keywords": [
6
+ "angular",
7
+ "angular material",
8
+ "angular cdk",
9
+ "virtual scroll",
10
+ "material form field",
11
+ "select",
12
+ "dropdown",
13
+ "multiselect",
14
+ "single select"
15
+ ],
16
+ "license": "MIT",
17
+ "engines": {
18
+ "node": "^18.13.0 || >=20.9.0"
19
+ },
20
+ "peerDependencies": {
21
+ "@angular/common": "^19.0.0",
22
+ "@angular/core": "^19.0.0",
23
+ "@angular/forms": "^19.0.0",
24
+ "@angular/cdk": "^19.0.0",
25
+ "@angular/material": "^19.0.0",
26
+ "rxjs": "^7.4.0"
27
+ },
28
+ "dependencies": {
29
+ "tslib": "^2.8.0"
30
+ },
31
+ "sideEffects": false,
32
+ "exports": {
33
+ "./theme": {
34
+ "sass": "./theme/index.scss"
35
+ },
36
+ "./package.json": {
37
+ "default": "./package.json"
38
+ },
39
+ ".": {
40
+ "types": "./index.d.ts",
41
+ "default": "./fesm2022/ngx-virtual-select-field-filterable.mjs"
42
+ }
43
+ },
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/kubiq/ngx-virtual-select-field",
47
+ "directory": "packages/ngx-virtual-select-field"
48
+ },
49
+ "author": {
50
+ "name": "Vizer"
51
+ },
52
+ "module": "fesm2022/ngx-virtual-select-field-filterable.mjs",
53
+ "typings": "index.d.ts"
54
+ }