@amro93/ngb-select 0.1.1

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":"amro93-ngb-select.mjs","sources":["../../../projects/ngb-select/src/lib/ngb-select.interface.ts","../../../projects/ngb-select/src/lib/ngb-select.component.ts","../../../projects/ngb-select/src/lib/ngb-select.component.html","../../../projects/ngb-select/src/amro93-ngb-select.ts"],"sourcesContent":["export type SelectSize = 'small' | 'medium' | 'large';\r\n\r\nexport type SelectDisplayMode = 'comma' | 'chip';\r\n\r\nexport type SelectVariant = 'filled' | 'outlined';\r\n\r\nexport type SelectFilterMatchMode = 'contains' | 'startsWith' | 'endsWith' | 'equals' | 'notEquals';\r\n\r\nexport type FocusOnOpenStrategy = 'always' | 'notSelected';\r\n\r\nexport type FloatLabelVariant = 'on' | 'in' | 'over';\r\n\r\nexport type DropdownDirection = 'auto' | 'up' | 'down' | 'top' | 'bottom';\r\nexport type DropdownPosition = DropdownDirection;\r\nexport type SelectDropdownPosition = DropdownDirection;\r\n\r\nexport interface SelectOption {\r\n label?: string;\r\n value?: any;\r\n disabled?: boolean;\r\n styleClass?: string;\r\n icon?: string;\r\n title?: string;\r\n items?: SelectOption[]; // For grouped options\r\n [key: string]: any; // Allow arbitrary custom metadata\r\n}\r\n\r\nexport interface SelectChangeEvent<T = any> {\r\n originalEvent: Event | null;\r\n value: T;\r\n}\r\n\r\nexport interface SelectFilterEvent {\r\n originalEvent: Event;\r\n filter: string;\r\n}\r\n\r\nexport interface SelectSelectAllChangeEvent {\r\n originalEvent: Event;\r\n checked: boolean;\r\n}\r\n\r\nexport interface SelectRemoveChipEvent {\r\n originalEvent: Event;\r\n value: any;\r\n}\r\n\r\nexport interface SelectLazyLoadEvent {\r\n first: number;\r\n last: number;\r\n [key: string]: any;\r\n}\r\n\r\nexport const NGB_SELECT_VERSION = '0.1.1';\r\n","import {\r\n Component,\r\n forwardRef,\r\n ElementRef,\r\n ViewChild,\r\n ContentChild,\r\n TemplateRef,\r\n HostListener,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n input,\r\n output,\r\n model,\r\n signal,\r\n computed,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\r\nimport {\r\n SelectOption,\r\n SelectFilterMatchMode,\r\n SelectSize,\r\n SelectVariant,\r\n SelectDisplayMode,\r\n FocusOnOpenStrategy,\r\n FloatLabelVariant,\r\n SelectChangeEvent,\r\n SelectFilterEvent,\r\n SelectSelectAllChangeEvent,\r\n SelectRemoveChipEvent,\r\n SelectLazyLoadEvent,\r\n DropdownPosition,\r\n DropdownDirection,\r\n NGB_SELECT_VERSION,\r\n} from './ngb-select.interface';\r\n\r\n@Component({\r\n selector: 'ngb-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './ngb-select.component.html',\r\n styleUrls: ['./ngb-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgbSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NgbSelectComponent implements ControlValueAccessor, OnInit, OnDestroy {\r\n public static readonly VERSION = NGB_SELECT_VERSION;\r\n\r\n // --- Basic & Data Inputs ---\r\n options = input<any[]>([]);\r\n optionLabel = input<string>('label');\r\n optionValue = input<string>('value');\r\n optionDisabled = input<string>('disabled');\r\n optionGroupLabel = input<string>('label');\r\n optionGroupChildren = input<string>('items');\r\n group = input<boolean>(false);\r\n dataKey = input<string | undefined>(undefined);\r\n placeholder = input<string | undefined>(undefined);\r\n\r\n // --- Multi-Select Inputs ---\r\n multiple = input<boolean>(false);\r\n display = input<SelectDisplayMode>('comma');\r\n showSelectAll = input<boolean>(false);\r\n maxSelectedLabels = input<number>(3);\r\n selectedItemsLabel = input<string>('{0} items selected');\r\n selectionLimit = input<number | undefined>(undefined);\r\n closeOnSelect = input<boolean>(false);\r\n\r\n // --- Filtering Inputs ---\r\n filter = input<boolean>(false);\r\n filterBy = input<string | undefined>(undefined);\r\n filterMatchMode = input<SelectFilterMatchMode>('contains');\r\n filterLocale = input<string | undefined>(undefined);\r\n filterNormalizeArabic = input<boolean>(true);\r\n filterPlaceholder = input<string | undefined>(undefined);\r\n searchPlaceholder = input<string | undefined>(undefined);\r\n filterInTrigger = input<boolean>(false);\r\n resetFilterOnHide = input<boolean>(false);\r\n emptyMessage = input<string>('No results found');\r\n emptyFilterMessage = input<string>('No results found');\r\n\r\n // --- State & Form Inputs ---\r\n disabled = model<boolean>(false);\r\n readonly = input<boolean>(false);\r\n loading = input<boolean>(false);\r\n showClear = input<boolean>(false);\r\n invalid = input<boolean>(false);\r\n floatLabel = input<boolean>(false);\r\n floatLabelVariant = input<FloatLabelVariant>('on');\r\n autofocus = input<boolean>(false);\r\n tabindex = input<number>(0);\r\n id = input<string | undefined>(undefined);\r\n ariaLabel = input<string | undefined>(undefined);\r\n ariaLabelledBy = input<string | undefined>(undefined);\r\n dir = input<'ltr' | 'rtl' | 'auto' | undefined>(undefined);\r\n\r\n // --- Display & Styling Inputs ---\r\n dropdownPosition = input<DropdownPosition>('auto');\r\n dropdownDirection = input<DropdownDirection | undefined>(undefined);\r\n direction = input<DropdownDirection | undefined>(undefined);\r\n size = input<SelectSize | undefined>(undefined);\r\n variant = input<SelectVariant>('outlined');\r\n fluid = input<boolean>(false);\r\n scrollHeight = input<string>('200px');\r\n style = input<{ [klass: string]: any } | null | undefined>(undefined);\r\n styleClass = input<string | undefined>(undefined);\r\n panelStyle = input<{ [klass: string]: any } | null | undefined>(undefined);\r\n panelStyleClass = input<string | undefined>(undefined);\r\n appendTo = input<'body' | HTMLElement | string | undefined>(undefined);\r\n\r\n // --- Modal / Popup Window Inputs ---\r\n modal = input<boolean>(false);\r\n popup = input<boolean>(false);\r\n touchUI = input<boolean>(false);\r\n popupTitle = input<string | undefined>(undefined);\r\n modalTitle = input<string | undefined>(undefined);\r\n\r\n // --- Advanced Features ---\r\n editable = input<boolean>(false);\r\n maxLength = input<number | undefined>(undefined);\r\n selectOnFocus = input<boolean>(false);\r\n autoOptionFocus = input<boolean>(true);\r\n focusOnOpen = input<number | undefined>(undefined);\r\n focusOnOpenStrategy = input<FocusOnOpenStrategy>('always');\r\n lazy = input<boolean>(false);\r\n\r\n // --- Two-way Overlay Visibility Binding ---\r\n overlayVisible = model<boolean>(false);\r\n\r\n // --- Event Outputs ---\r\n onChange = output<SelectChangeEvent>();\r\n onFilter = output<SelectFilterEvent>();\r\n onFocus = output<Event>();\r\n onBlur = output<Event>();\r\n onShow = output<Event | null>();\r\n onHide = output<Event | null>();\r\n onClear = output<Event>();\r\n onSelectAllChange = output<SelectSelectAllChangeEvent>();\r\n onRemoveChip = output<SelectRemoveChipEvent>();\r\n onLazyLoad = output<SelectLazyLoadEvent>();\r\n\r\n // --- Custom Content Templates ---\r\n @ContentChild('item') itemTemplate?: TemplateRef<any>;\r\n @ContentChild('selectedItem') selectedItemTemplate?: TemplateRef<any>;\r\n @ContentChild('label') labelTemplate?: TemplateRef<any>;\r\n @ContentChild('chip') chipTemplate?: TemplateRef<any>;\r\n @ContentChild('headerCheckbox') headerCheckboxTemplate?: TemplateRef<any>;\r\n @ContentChild('header') headerTemplate?: TemplateRef<any>;\r\n @ContentChild('footer') footerTemplate?: TemplateRef<any>;\r\n @ContentChild('group') groupTemplate?: TemplateRef<any>;\r\n @ContentChild('empty') emptyTemplate?: TemplateRef<any>;\r\n @ContentChild('clearIcon') clearIconTemplate?: TemplateRef<any>;\r\n @ContentChild('dropdownIcon') dropdownIconTemplate?: TemplateRef<any>;\r\n @ContentChild('filterIcon') filterIconTemplate?: TemplateRef<any>;\r\n\r\n // --- View References ---\r\n @ViewChild('filterInput') filterInputElement?: ElementRef<HTMLInputElement>;\r\n @ViewChild('triggerFilterInput') triggerFilterInputElement?: ElementRef<HTMLInputElement>;\r\n @ViewChild('editableInput') editableInputElement?: ElementRef<HTMLInputElement>;\r\n @ViewChild('dropdownMenu') dropdownMenuElement?: ElementRef<HTMLDivElement>;\r\n\r\n effectiveSearchPlaceholder = computed(() => {\r\n return this.searchPlaceholder() || this.filterPlaceholder() || this.placeholder() || 'Search...';\r\n });\r\n\r\n effectiveDropdownPosition = computed<DropdownPosition>(() => {\r\n return this.dropdownDirection() || this.direction() || this.dropdownPosition() || 'auto';\r\n });\r\n\r\n currentPlacement = signal<'bottom' | 'top'>('bottom');\r\n isDropup = computed(() => this.currentPlacement() === 'top');\r\n\r\n isModalMode = computed(() => this.modal() || this.popup() || this.touchUI());\r\n effectivePopupTitle = computed(() => {\r\n return this.popupTitle() || this.modalTitle() || this.placeholder() || 'Select an Option';\r\n });\r\n\r\n effectiveFilterValue = computed(() => {\r\n return this.overlayVisible()\r\n ? this.filterValue()\r\n : this.hasSelectedValue()\r\n ? ''\r\n : this.filterValue();\r\n });\r\n\r\n // --- Internal State ---\r\n public value = signal<any>(null);\r\n public filteredOptions = signal<any[]>([]);\r\n public filterValue = signal<string>('');\r\n public focusedIndex = signal<number>(-1);\r\n public selectAll = signal<boolean | null>(null);\r\n\r\n // --- ControlValueAccessor Callbacks ---\r\n private onModelChange: (value: any) => void = () => {};\r\n private onModelTouched: () => void = () => {};\r\n\r\n constructor(\r\n public elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef,\r\n ) {\r\n effect(() => {\r\n // React to options or group changes\r\n this.options();\r\n this.group();\r\n this.updateFilteredOptions();\r\n this.updateSelectAllState();\r\n });\r\n\r\n effect(() => {\r\n // React to overlayVisible changes\r\n const visible = this.overlayVisible();\r\n if (visible) {\r\n this.openOverlay();\r\n } else {\r\n this.closeOverlay();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.autofocus()) {\r\n setTimeout(() => this.focus());\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cleanAppendTo();\r\n }\r\n\r\n safeOptions = computed(() => {\r\n const opts = this.options();\r\n return Array.isArray(opts) ? opts : [];\r\n });\r\n\r\n writeValue(obj: any): void {\r\n if (this.multiple()) {\r\n this.value.set(Array.isArray(obj) ? [...obj] : []);\r\n } else {\r\n this.value.set(obj !== undefined ? obj : null);\r\n }\r\n this.updateSelectAllState();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onModelTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n hasSelectedValue = computed(() => {\r\n const val = this.value();\r\n if (this.multiple()) {\r\n return Array.isArray(val) && val.length > 0;\r\n }\r\n return val !== null && val !== undefined && val !== '';\r\n });\r\n\r\n getDisplayLabel(): string {\r\n if (!this.hasSelectedValue()) {\r\n return '';\r\n }\r\n\r\n if (this.multiple()) {\r\n const selectedList = Array.isArray(this.value()) ? this.value() : [];\r\n if (selectedList.length > this.maxSelectedLabels()) {\r\n return this.selectedItemsLabel().replace('{0}', String(selectedList.length));\r\n }\r\n return selectedList.map((val: any) => this.resolveOptionLabelByValue(val)).join(', ');\r\n }\r\n\r\n if (this.editable() && typeof this.value() === 'string') {\r\n return this.value();\r\n }\r\n\r\n return this.resolveOptionLabelByValue(this.value());\r\n }\r\n\r\n resolveOptionLabelByValue(val: any): string {\r\n const selectedOpt = this.findOptionByValue(val);\r\n if (selectedOpt !== undefined && selectedOpt !== null) {\r\n return this.resolveOptionLabel(selectedOpt);\r\n }\r\n return this.resolveOptionLabel(val);\r\n }\r\n\r\n resolveOptionLabel(option: any): string {\r\n if (option === null || option === undefined) return '';\r\n if (typeof option === 'object') {\r\n if (this.optionLabel() && option[this.optionLabel()] !== undefined) {\r\n return String(option[this.optionLabel()]);\r\n }\r\n if (option.label !== undefined) {\r\n return String(option.label);\r\n }\r\n return JSON.stringify(option);\r\n }\r\n return String(option);\r\n }\r\n\r\n resolveOptionValue(option: any): any {\r\n if (option === null || option === undefined) return null;\r\n if (typeof option === 'object') {\r\n if (this.optionValue() && option[this.optionValue()] !== undefined) {\r\n return option[this.optionValue()];\r\n }\r\n if (option.value !== undefined) {\r\n return option.value;\r\n }\r\n }\r\n return option;\r\n }\r\n\r\n isOptionDisabled(option: any): boolean {\r\n if (this.disabled()) return true;\r\n if (option && typeof option === 'object') {\r\n if (this.optionDisabled() && option[this.optionDisabled()] !== undefined) {\r\n return Boolean(option[this.optionDisabled()]);\r\n }\r\n return Boolean(option.disabled);\r\n }\r\n return false;\r\n }\r\n\r\n resolveOptionGroupLabel(groupOption: any): string {\r\n if (!groupOption) return '';\r\n if (this.optionGroupLabel() && groupOption[this.optionGroupLabel()] !== undefined) {\r\n return String(groupOption[this.optionGroupLabel()]);\r\n }\r\n return String(groupOption.label || '');\r\n }\r\n\r\n resolveOptionGroupChildren(groupOption: any): any[] {\r\n if (!groupOption) return [];\r\n if (this.optionGroupChildren() && Array.isArray(groupOption[this.optionGroupChildren()])) {\r\n return groupOption[this.optionGroupChildren()];\r\n }\r\n return Array.isArray(groupOption.items) ? groupOption.items : [];\r\n }\r\n\r\n findOptionByValue(val: any): any {\r\n if (val === null || val === undefined) return undefined;\r\n if (this.group()) {\r\n for (const grp of this.safeOptions()) {\r\n const children = this.resolveOptionGroupChildren(grp);\r\n const match = children.find((opt) =>\r\n this.areValuesEqual(this.resolveOptionValue(opt), val),\r\n );\r\n if (match !== undefined) return match;\r\n }\r\n return undefined;\r\n }\r\n return this.safeOptions().find((opt) => this.areValuesEqual(this.resolveOptionValue(opt), val));\r\n }\r\n\r\n areValuesEqual(val1: any, val2: any): boolean {\r\n if (val1 === val2) return true;\r\n if (val1 === null || val1 === undefined || val2 === null || val2 === undefined) return false;\r\n if (typeof val1 === 'object' && typeof val2 === 'object') {\r\n const dataKey = this.dataKey();\r\n if (dataKey && val1[dataKey] !== undefined && val2[dataKey] !== undefined) {\r\n return val1[dataKey] === val2[dataKey];\r\n }\r\n if (\r\n this.optionValue() &&\r\n val1[this.optionValue()] !== undefined &&\r\n val2[this.optionValue()] !== undefined\r\n ) {\r\n return val1[this.optionValue()] === val2[this.optionValue()];\r\n }\r\n try {\r\n return JSON.stringify(val1) === JSON.stringify(val2);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n isSelected(option: any): boolean {\r\n const optVal = this.resolveOptionValue(option);\r\n if (this.multiple() && Array.isArray(this.value())) {\r\n return this.value().some((item: any) => this.areValuesEqual(item, optVal));\r\n }\r\n return this.areValuesEqual(this.value(), optVal);\r\n }\r\n\r\n isOptionsEmpty(): boolean {\r\n if (this.filteredOptions().length === 0) return true;\r\n if (this.group()) {\r\n return this.filteredOptions().every((grp) => this.resolveOptionGroupChildren(grp).length === 0);\r\n }\r\n return false;\r\n }\r\n\r\n onTriggerClick(event: MouseEvent): void {\r\n if (this.disabled() || this.readonly()) return;\r\n this.toggleOverlay(event);\r\n }\r\n\r\n calculateDropdownPosition(): void {\r\n const pref = this.effectiveDropdownPosition();\r\n if (pref === 'top' || pref === 'up') {\r\n this.currentPlacement.set('top');\r\n return;\r\n }\r\n if (pref === 'bottom' || pref === 'down') {\r\n this.currentPlacement.set('bottom');\r\n return;\r\n }\r\n\r\n // Auto positioning based on viewport space\r\n if (typeof window === 'undefined' || !this.elementRef?.nativeElement) {\r\n this.currentPlacement.set('bottom');\r\n return;\r\n }\r\n\r\n const triggerRect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - triggerRect.bottom;\r\n const spaceAbove = triggerRect.top;\r\n\r\n let panelHeight = 200;\r\n if (this.dropdownMenuElement?.nativeElement?.offsetHeight) {\r\n panelHeight = this.dropdownMenuElement.nativeElement.offsetHeight;\r\n } else if (this.scrollHeight()) {\r\n const parsed = parseInt(this.scrollHeight(), 10);\r\n if (!isNaN(parsed) && parsed > 0) {\r\n panelHeight = parsed;\r\n }\r\n }\r\n\r\n if (spaceBelow < panelHeight && spaceAbove > spaceBelow) {\r\n this.currentPlacement.set('top');\r\n } else {\r\n this.currentPlacement.set('bottom');\r\n }\r\n }\r\n\r\n toggleOverlay(event?: Event): void {\r\n if (this.overlayVisible()) {\r\n this.closeOverlay(event);\r\n } else {\r\n this.openOverlay(event);\r\n }\r\n }\r\n\r\n openOverlay(event?: Event): void {\r\n if (this.disabled() || this.readonly() || this.overlayVisible()) return;\r\n\r\n this.calculateDropdownPosition();\r\n this.overlayVisible.set(true);\r\n this.onShow.emit(event || null);\r\n this.onModelTouched();\r\n\r\n setTimeout(() => {\r\n this.calculateDropdownPosition();\r\n if (this.filterInTrigger() && this.triggerFilterInputElement) {\r\n this.triggerFilterInputElement.nativeElement.focus();\r\n } else if (this.filter() && this.filterInputElement) {\r\n this.filterInputElement.nativeElement.focus();\r\n }\r\n this.handleFocusOnOpen();\r\n this.handleAppendTo();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n closeOverlay(event?: Event): void {\r\n if (!this.overlayVisible()) return;\r\n\r\n this.overlayVisible.set(false);\r\n this.onHide.emit(event || null);\r\n\r\n if (this.resetFilterOnHide() && this.filterValue()) {\r\n this.filterValue.set('');\r\n this.updateFilteredOptions();\r\n }\r\n this.focusedIndex.set(-1);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private handleFocusOnOpen(): void {\r\n const flatItems = this.getFlatFilteredOptions();\r\n let targetIndex = -1;\r\n\r\n const hasSelection = this.hasSelectedValue();\r\n const selectedIdx = flatItems.findIndex((opt) => this.isSelected(opt));\r\n\r\n const focusOnOpen = this.focusOnOpen();\r\n if (\r\n focusOnOpen !== undefined &&\r\n focusOnOpen >= 0 &&\r\n focusOnOpen < flatItems.length\r\n ) {\r\n if (this.focusOnOpenStrategy() === 'notSelected' && hasSelection && selectedIdx !== -1) {\r\n targetIndex = selectedIdx;\r\n } else {\r\n targetIndex = focusOnOpen;\r\n }\r\n } else if (this.autoOptionFocus()) {\r\n targetIndex = selectedIdx !== -1 ? selectedIdx : 0;\r\n }\r\n\r\n if (targetIndex !== -1 && this.dropdownMenuElement) {\r\n this.focusedIndex.set(targetIndex);\r\n const elements = this.dropdownMenuElement.nativeElement.querySelectorAll(\r\n '.dropdown-item[role=\"option\"]',\r\n );\r\n const targetElement = elements[targetIndex] as HTMLElement;\r\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\r\n targetElement.scrollIntoView({ block: 'nearest', inline: 'start' });\r\n }\r\n }\r\n }\r\n\r\n onOptionClick(option: any, event: Event): void {\r\n if (this.isOptionDisabled(option)) return;\r\n\r\n const val = this.resolveOptionValue(option);\r\n\r\n if (this.multiple()) {\r\n let currentSelection: any[] = Array.isArray(this.value()) ? [...this.value()] : [];\r\n const selectedIndex = currentSelection.findIndex((item) => this.areValuesEqual(item, val));\r\n\r\n if (selectedIndex !== -1) {\r\n currentSelection.splice(selectedIndex, 1);\r\n } else {\r\n if (this.selectionLimit() !== undefined && currentSelection.length >= this.selectionLimit()!) {\r\n return;\r\n }\r\n currentSelection.push(val);\r\n }\r\n\r\n this.updateModel(currentSelection, event);\r\n this.updateSelectAllState();\r\n\r\n if (this.closeOnSelect()) {\r\n this.closeOverlay(event);\r\n }\r\n } else {\r\n this.updateModel(val, event);\r\n if (this.filterInTrigger()) {\r\n this.filterValue.set('');\r\n this.updateFilteredOptions();\r\n if (this.triggerFilterInputElement) {\r\n this.triggerFilterInputElement.nativeElement.value = '';\r\n }\r\n }\r\n this.closeOverlay(event);\r\n }\r\n }\r\n\r\n removeChip(val: any, event: Event): void {\r\n event.stopPropagation();\r\n if (this.disabled() || this.readonly()) return;\r\n\r\n if (Array.isArray(this.value())) {\r\n const nextVal = this.value().filter((item: any) => !this.areValuesEqual(item, val));\r\n this.updateModel(nextVal, event);\r\n this.onRemoveChip.emit({ originalEvent: event, value: val });\r\n this.updateSelectAllState();\r\n }\r\n }\r\n\r\n toggleSelectAll(event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n const targetOptions = this.getFlatFilteredOptions().filter(\r\n (opt) => !this.isOptionDisabled(opt),\r\n );\r\n\r\n if (checked) {\r\n let allValues = targetOptions.map((opt) => this.resolveOptionValue(opt));\r\n if (this.selectionLimit() !== undefined) {\r\n allValues = allValues.slice(0, this.selectionLimit());\r\n }\r\n this.value.set(allValues);\r\n } else {\r\n this.value.set([]);\r\n }\r\n\r\n this.selectAll.set(checked);\r\n this.updateModel(this.value(), event);\r\n this.onSelectAllChange.emit({ originalEvent: event, checked });\r\n }\r\n\r\n updateSelectAllState(): void {\r\n if (!this.multiple() || !this.showSelectAll()) return;\r\n const targetOptions = this.getFlatFilteredOptions().filter(\r\n (opt) => !this.isOptionDisabled(opt),\r\n );\r\n if (targetOptions.length === 0) {\r\n this.selectAll.set(false);\r\n return;\r\n }\r\n this.selectAll.set(targetOptions.every((opt) => this.isSelected(opt)));\r\n }\r\n\r\n private updateModel(val: any, event: Event | null): void {\r\n this.value.set(val);\r\n this.onModelChange(this.value());\r\n this.onChange.emit({\r\n originalEvent: event,\r\n value: this.value(),\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onClearClick(event: Event): void {\r\n event.stopPropagation();\r\n if (this.disabled() || this.readonly()) return;\r\n\r\n const clearedValue = this.multiple() ? [] : null;\r\n this.updateModel(clearedValue, event);\r\n this.updateSelectAllState();\r\n this.onClear.emit(event);\r\n }\r\n\r\n onEditableInput(event: Event): void {\r\n const inputVal = (event.target as HTMLInputElement).value;\r\n this.updateModel(inputVal, event);\r\n }\r\n\r\n onEditableFocus(event: FocusEvent): void {\r\n if (this.selectOnFocus() && this.editableInputElement) {\r\n this.editableInputElement.nativeElement.select();\r\n }\r\n this.onFocus.emit(event);\r\n }\r\n\r\n onFilterChange(event: Event): void {\r\n const raw = (event.target as HTMLInputElement).value || '';\r\n this.filterValue.set(raw);\r\n this.updateFilteredOptions();\r\n this.updateSelectAllState();\r\n this.onFilter.emit({\r\n originalEvent: event,\r\n filter: this.filterValue(),\r\n });\r\n }\r\n\r\n updateFilteredOptions(): void {\r\n if (!this.filterValue()) {\r\n this.filteredOptions.set([...this.safeOptions()]);\r\n return;\r\n }\r\n\r\n const query = this.filterValue();\r\n\r\n if (this.group()) {\r\n this.filteredOptions.set(this.safeOptions()\r\n .map((group) => {\r\n const children = this.resolveOptionGroupChildren(group);\r\n const filteredChildren = children.filter((opt) => this.matchesFilter(opt, query));\r\n return {\r\n ...group,\r\n [this.optionGroupChildren()]: filteredChildren,\r\n };\r\n })\r\n .filter((group) => this.resolveOptionGroupChildren(group).length > 0));\r\n } else {\r\n this.filteredOptions.set(this.safeOptions().filter((opt) => this.matchesFilter(opt, query)));\r\n }\r\n }\r\n\r\n private matchesFilter(option: any, query: string): boolean {\r\n if (!option) return false;\r\n const fieldsToSearch = this.getFilterFields();\r\n\r\n return fieldsToSearch.some((field) => {\r\n const val = this.resolveFieldData(option, field);\r\n if (val === null || val === undefined) return false;\r\n\r\n const stringVal = String(val);\r\n return this.compareStrings(stringVal, query, this.filterMatchMode(), this.filterLocale());\r\n });\r\n }\r\n\r\n private getFilterFields(): string[] {\r\n if (this.filterBy()) {\r\n return this.filterBy()!.split(',').map((f) => f.trim());\r\n }\r\n return [this.optionLabel() || 'label'];\r\n }\r\n\r\n private resolveFieldData(data: any, field: string): any {\r\n if (data && field) {\r\n if (field.indexOf('.') === -1) {\r\n return data[field] !== undefined\r\n ? data[field]\r\n : typeof data === 'string' || typeof data === 'number'\r\n ? data\r\n : null;\r\n }\r\n const fields = field.split('.');\r\n let value = data;\r\n for (const f of fields) {\r\n if (value === null || value === undefined) return null;\r\n value = value[f];\r\n }\r\n return value;\r\n }\r\n return null;\r\n }\r\n\r\n private normalizeArabicText(text: string): string {\r\n return text\r\n .replace(/[\\u064B-\\u065F\\u0670\\u0640]/g, '') // Remove Arabic Tashkeel diacritics & Tatweel\r\n .replace(/[إأآا]/g, 'ا') // Normalize Alef forms\r\n .replace(/[يى]/g, 'ي') // Normalize Yaa & Alef Maksura\r\n .replace(/[ة]/g, 'ه'); // Normalize Taa Marbuta\r\n }\r\n\r\n private compareStrings(\r\n val: string,\r\n query: string,\r\n mode: SelectFilterMatchMode,\r\n locale?: string,\r\n ): boolean {\r\n let v = locale ? val.toLocaleLowerCase(locale) : val.toLowerCase();\r\n let q = locale ? query.toLocaleLowerCase(locale) : query.toLowerCase();\r\n\r\n if (this.filterNormalizeArabic()) {\r\n v = this.normalizeArabicText(v);\r\n q = this.normalizeArabicText(q);\r\n }\r\n\r\n switch (mode) {\r\n case 'startsWith':\r\n return v.startsWith(q);\r\n case 'endsWith':\r\n return v.endsWith(q);\r\n case 'equals':\r\n return v === q;\r\n case 'notEquals':\r\n return v !== q;\r\n case 'contains':\r\n default:\r\n return v.includes(q);\r\n }\r\n }\r\n\r\n public getFlatFilteredOptions(): any[] {\r\n if (this.group()) {\r\n const flat: any[] = [];\r\n for (const grp of this.filteredOptions()) {\r\n flat.push(...this.resolveOptionGroupChildren(grp));\r\n }\r\n return flat;\r\n }\r\n return this.filteredOptions();\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.disabled() || this.readonly()) return;\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (!this.overlayVisible()) {\r\n this.openOverlay(event);\r\n } else {\r\n this.navigateOption(1);\r\n }\r\n break;\r\n\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (!this.overlayVisible()) {\r\n this.openOverlay(event);\r\n } else {\r\n this.navigateOption(-1);\r\n }\r\n break;\r\n\r\n case 'Enter':\r\n case ' ':\r\n if (\r\n event.key === ' ' &&\r\n ((this.filter() && this.filterInputElement?.nativeElement === document.activeElement) ||\r\n (this.filterInTrigger() &&\r\n this.triggerFilterInputElement?.nativeElement === document.activeElement))\r\n ) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (!this.overlayVisible()) {\r\n this.openOverlay(event);\r\n } else {\r\n const flatItems = this.getFlatFilteredOptions();\r\n if (this.focusedIndex() >= 0 && this.focusedIndex() < flatItems.length) {\r\n this.onOptionClick(flatItems[this.focusedIndex()], event);\r\n }\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (this.overlayVisible()) {\r\n event.preventDefault();\r\n this.closeOverlay(event);\r\n }\r\n break;\r\n\r\n case 'Tab':\r\n if (this.overlayVisible()) {\r\n this.closeOverlay(event);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n onFilterKeydown(event: KeyboardEvent): void {\r\n if (\r\n event.key === 'ArrowDown' ||\r\n event.key === 'ArrowUp' ||\r\n event.key === 'Enter' ||\r\n event.key === 'Escape'\r\n ) {\r\n this.onKeydown(event);\r\n }\r\n }\r\n\r\n private navigateOption(step: number): void {\r\n const flatItems = this.getFlatFilteredOptions();\r\n if (flatItems.length === 0) return;\r\n\r\n let nextIdx = this.focusedIndex() + step;\r\n if (nextIdx < 0) nextIdx = 0;\r\n if (nextIdx >= flatItems.length) nextIdx = flatItems.length - 1;\r\n\r\n while (\r\n nextIdx >= 0 &&\r\n nextIdx < flatItems.length &&\r\n this.isOptionDisabled(flatItems[nextIdx])\r\n ) {\r\n nextIdx += step;\r\n }\r\n\r\n if (nextIdx >= 0 && nextIdx < flatItems.length) {\r\n this.focusedIndex.set(nextIdx);\r\n if (this.dropdownMenuElement) {\r\n const elements = this.dropdownMenuElement.nativeElement.querySelectorAll(\r\n '.dropdown-item[role=\"option\"]',\r\n );\r\n const targetElement = elements[nextIdx] as HTMLElement;\r\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\r\n targetElement.scrollIntoView({ block: 'nearest', inline: 'start' });\r\n }\r\n }\r\n }\r\n }\r\n\r\n isOptionFocused(option: any): boolean {\r\n if (this.focusedIndex() < 0) return false;\r\n const flat = this.getFlatFilteredOptions();\r\n if (this.focusedIndex() >= flat.length) return false;\r\n return this.areValuesEqual(\r\n this.resolveOptionValue(flat[this.focusedIndex()]),\r\n this.resolveOptionValue(option),\r\n );\r\n }\r\n\r\n onOverlayScroll(event: Event): void {\r\n if (!this.lazy()) return;\r\n const target = event.target as HTMLElement;\r\n if (target.scrollTop + target.clientHeight >= target.scrollHeight - 10) {\r\n const flat = this.getFlatFilteredOptions();\r\n this.onLazyLoad.emit({\r\n first: flat.length,\r\n last: flat.length + 10,\r\n });\r\n }\r\n }\r\n\r\n private handleAppendTo(): void {\r\n const appendTo = this.appendTo();\r\n if (!appendTo || !this.dropdownMenuElement) return;\r\n if (appendTo === 'body') {\r\n document.body.appendChild(this.dropdownMenuElement.nativeElement);\r\n this.repositionOverlay();\r\n } else if (appendTo instanceof HTMLElement) {\r\n appendTo.appendChild(this.dropdownMenuElement.nativeElement);\r\n this.repositionOverlay();\r\n }\r\n }\r\n\r\n private repositionOverlay(): void {\r\n if (!this.dropdownMenuElement || this.isModalMode()) return;\r\n this.calculateDropdownPosition();\r\n const triggerRect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const dropdown = this.dropdownMenuElement.nativeElement;\r\n dropdown.style.position = 'fixed';\r\n dropdown.style.left = `${triggerRect.left}px`;\r\n dropdown.style.width = `${triggerRect.width}px`;\r\n dropdown.style.minWidth = `${triggerRect.width}px`;\r\n dropdown.style.maxWidth = `${triggerRect.width}px`;\r\n dropdown.style.boxSizing = 'border-box';\r\n dropdown.style.zIndex = '1060';\r\n\r\n if (this.isDropup()) {\r\n dropdown.style.top = 'auto';\r\n dropdown.style.bottom = `${window.innerHeight - triggerRect.top + 2}px`;\r\n } else {\r\n dropdown.style.top = `${triggerRect.bottom + 2}px`;\r\n dropdown.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n private cleanAppendTo(): void {\r\n if (this.appendTo() && this.dropdownMenuElement) {\r\n const el = this.dropdownMenuElement.nativeElement;\r\n if (el.parentElement) {\r\n el.parentElement.removeChild(el);\r\n }\r\n }\r\n }\r\n\r\n onTriggerFocus(event: FocusEvent): void {\r\n this.onFocus.emit(event);\r\n }\r\n\r\n onTriggerBlur(event: FocusEvent): void {\r\n this.onBlur.emit(event);\r\n }\r\n\r\n public focus(): void {\r\n if (this.filterInTrigger() && this.triggerFilterInputElement) {\r\n this.triggerFilterInputElement.nativeElement.focus();\r\n } else if (this.editable() && !this.multiple() && this.editableInputElement) {\r\n this.editableInputElement.nativeElement.focus();\r\n } else {\r\n const trigger = this.elementRef.nativeElement.querySelector('.form-select');\r\n if (trigger) trigger.focus();\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n if (this.overlayVisible()) {\r\n this.calculateDropdownPosition();\r\n if (this.appendTo()) {\r\n this.repositionOverlay();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('window:scroll')\r\n onWindowScroll(): void {\r\n if (this.overlayVisible()) {\r\n this.calculateDropdownPosition();\r\n if (this.appendTo()) {\r\n this.repositionOverlay();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.overlayVisible() && !this.elementRef.nativeElement.contains(event.target)) {\r\n if (\r\n this.dropdownMenuElement &&\r\n this.dropdownMenuElement.nativeElement.contains(event.target as Node)\r\n ) {\r\n return;\r\n }\r\n this.closeOverlay(event);\r\n }\r\n }\r\n}\r\n","<div\n class=\"ngb-select-container position-relative\"\n [class.form-floating]=\"floatLabel()\"\n [class.float-variant-on]=\"floatLabel() && floatLabelVariant() === 'on'\"\n [class.float-variant-in]=\"floatLabel() && floatLabelVariant() === 'in'\"\n [class.float-variant-over]=\"floatLabel() && floatLabelVariant() === 'over'\"\n [class.floating-active]=\"hasSelectedValue() || overlayVisible()\"\n [class.dropup]=\"isDropup()\"\n [class.dropdown-up]=\"isDropup()\"\n [class.w-100]=\"fluid()\"\n [attr.dir]=\"dir() || null\"\n [ngStyle]=\"style()\"\n [ngClass]=\"styleClass()\"\n (keydown)=\"onKeydown($event)\"\n>\n <!-- Select Trigger Box -->\n <div\n class=\"form-select d-flex align-items-center justify-content-between\"\n [class.is-invalid]=\"invalid()\"\n [class.disabled]=\"disabled()\"\n [class.form-select-sm]=\"size() === 'small'\"\n [class.form-select-lg]=\"size() === 'large'\"\n [class.bg-light]=\"variant() === 'filled'\"\n [attr.id]=\"id()\"\n [attr.tabindex]=\"disabled() ? -1 : tabindex()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-expanded]=\"overlayVisible()\"\n [attr.aria-haspopup]=\"'listbox'\"\n role=\"combobox\"\n (click)=\"onTriggerClick($event)\"\n (focus)=\"onTriggerFocus($event)\"\n (blur)=\"onTriggerBlur($event)\"\n >\n <!-- Selected Value / Input / Chips Area -->\n <span class=\"text-truncate flex-grow-1 me-2 d-flex flex-wrap align-items-center gap-1\">\n <!-- Filter directly in Trigger Box -->\n @if (filterInTrigger()) {\n <!-- Chips in multiple mode when filterInTrigger is active -->\n @if (multiple() && display() === 'chip' && hasSelectedValue()) {\n @for (val of value(); track val) {\n <span\n class=\"badge bg-light text-dark border d-inline-flex align-items-center gap-1 py-1 px-2\"\n >\n @if (chipTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n chipTemplate;\n context: { $implicit: findOptionByValue(val) ?? val, value: val }\n \"\n ></ng-container>\n } @else {\n <span>{{ resolveOptionLabelByValue(val) }}</span>\n }\n @if (!disabled() && !readonly()) {\n <i\n class=\"bi bi-x ms-1 cursor-pointer fw-bold\"\n (click)=\"removeChip(val, $event)\"\n ></i>\n }\n </span>\n }\n }\n <!-- Search Filter Input embedded inside the trigger -->\n <input\n #triggerFilterInput\n type=\"text\"\n class=\"form-control border-0 bg-transparent p-0 shadow-none flex-grow-1\"\n style=\"min-width: 80px\"\n [class.form-control-sm]=\"size() === 'small'\"\n [class.form-control-lg]=\"size() === 'large'\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [value]=\"effectiveFilterValue()\"\n [placeholder]=\"\n multiple() && hasSelectedValue()\n ? ''\n : hasSelectedValue() && !overlayVisible()\n ? getDisplayLabel()\n : effectiveSearchPlaceholder()\n \"\n (input)=\"onFilterChange($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n (focus)=\"openOverlay($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <!-- Editable Input (Single mode only) -->\n @if (editable() && !multiple()) {\n <input\n #editableInput\n type=\"text\"\n class=\"form-control border-0 bg-transparent p-0 shadow-none\"\n [class.form-control-sm]=\"size() === 'small'\"\n [class.form-control-lg]=\"size() === 'large'\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.maxlength]=\"maxLength()\"\n [value]=\"getDisplayLabel()\"\n [placeholder]=\"placeholder() || ''\"\n (input)=\"onEditableInput($event)\"\n (focus)=\"onEditableFocus($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <!-- Multi-Select Chips Display Mode -->\n @if (multiple() && display() === 'chip' && hasSelectedValue()) {\n @for (val of value(); track val) {\n <span\n class=\"badge bg-light text-dark border d-inline-flex align-items-center gap-1 py-1 px-2\"\n >\n @if (chipTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n chipTemplate;\n context: { $implicit: findOptionByValue(val) ?? val, value: val }\n \"\n ></ng-container>\n } @else {\n <span>{{ resolveOptionLabelByValue(val) }}</span>\n }\n @if (!disabled() && !readonly()) {\n <i\n class=\"bi bi-x ms-1 cursor-pointer fw-bold\"\n (click)=\"removeChip(val, $event)\"\n ></i>\n }\n </span>\n }\n } @else {\n @if (hasSelectedValue()) {\n @if (selectedItemTemplate || labelTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n selectedItemTemplate || labelTemplate;\n context: { $implicit: findOptionByValue(value()) ?? value(), value: value() }\n \"\n ></ng-container>\n } @else {\n <span>{{ getDisplayLabel() }}</span>\n }\n } @else {\n <span class=\"text-muted\">{{ floatLabel() ? '' : placeholder() || '' }}</span>\n }\n }\n <!-- Standard Single or Comma Multi-Select Text -->\n }\n }\n </span>\n\n <!-- Icons & Spinners Area -->\n <div class=\"d-flex align-items-center flex-shrink-0 gap-1 ms-auto\">\n <!-- Clear Icon -->\n @if (showClear() && hasSelectedValue() && !disabled() && !readonly()) {\n <span\n class=\"ngb-select-clear-icon text-muted me-1\"\n (click)=\"onClearClick($event)\"\n title=\"Clear\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Clear value\"\n >\n @if (clearIconTemplate) {\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n } @else {\n <i class=\"bi bi-x-circle-fill\"></i>\n }\n </span>\n }\n\n <!-- Loading Spinner -->\n @if (loading()) {\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n\n <!-- Dropdown Caret Icon -->\n @if (!loading()) {\n <span class=\"ngb-select-dropdown-icon text-secondary\">\n @if (dropdownIconTemplate) {\n <ng-container *ngTemplateOutlet=\"dropdownIconTemplate\"></ng-container>\n } @else {\n <i class=\"bi bi-chevron-down\" [class.rotate-180]=\"overlayVisible()\"></i>\n }\n </span>\n }\n </div>\n </div>\n\n <!-- Float Label Support -->\n @if (floatLabel() && placeholder()) {\n <label [attr.for]=\"id()\">{{ placeholder() }}</label>\n }\n\n <ng-template #dropdownContent>\n <!-- Header Template -->\n @if (headerTemplate) {\n <div class=\"p-2 border-bottom\">\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n </div>\n }\n\n <!-- Header: Select All Checkbox & Search / Filter Box -->\n @if ((filter() && !filterInTrigger()) || (multiple() && showSelectAll())) {\n <div class=\"p-2 border-bottom bg-light bg-opacity-50\">\n <!-- Select All Checkbox -->\n @if (multiple() && showSelectAll()) {\n <div class=\"d-flex align-items-center mb-2 px-1\">\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2 mt-0 cursor-pointer\"\n [checked]=\"selectAll()\"\n (change)=\"toggleSelectAll($event)\"\n id=\"selectAllCheckbox\"\n />\n <label\n class=\"form-check-label small fw-semibold cursor-pointer user-select-none\"\n for=\"selectAllCheckbox\"\n >\n @if (headerCheckboxTemplate) {\n <ng-container\n *ngTemplateOutlet=\"headerCheckboxTemplate; context: { $implicit: selectAll() }\"\n ></ng-container>\n } @else {\n Select All\n }\n </label>\n </div>\n }\n <!-- Search Box -->\n @if (filter() && !filterInTrigger()) {\n <div class=\"input-group input-group-sm\">\n <span class=\"input-group-text bg-transparent border-end-0\">\n @if (filterIconTemplate) {\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\n } @else {\n <i class=\"bi bi-search text-muted\"></i>\n }\n </span>\n <input\n #filterInput\n type=\"text\"\n class=\"form-control border-start-0\"\n [placeholder]=\"effectiveSearchPlaceholder()\"\n [value]=\"filterValue()\"\n (input)=\"onFilterChange($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- Grouped Options Mode -->\n @if (group()) {\n @for (groupOption of filteredOptions(); track groupOption) {\n <div>\n <!-- Group Header -->\n <h6\n class=\"dropdown-header text-muted py-2 px-3 m-0 bg-light bg-opacity-75 d-flex align-items-center\"\n >\n @if (groupTemplate) {\n <ng-container\n *ngTemplateOutlet=\"groupTemplate; context: { $implicit: groupOption }\"\n ></ng-container>\n } @else {\n {{ resolveOptionGroupLabel(groupOption) }}\n }\n </h6>\n <!-- Group Items -->\n @for (option of resolveOptionGroupChildren(groupOption); track option) {\n <button\n type=\"button\"\n class=\"dropdown-item d-flex align-items-center py-2 px-3\"\n [class.active]=\"!multiple() && isSelected(option)\"\n [class.bg-light]=\"multiple() && isSelected(option)\"\n [class.fw-semibold]=\"multiple() && isSelected(option)\"\n [class.focus]=\"isOptionFocused(option)\"\n [class.bg-body-secondary]=\"isOptionFocused(option) && !isSelected(option)\"\n [class.disabled]=\"isOptionDisabled(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-checked]=\"multiple() ? isSelected(option) : null\"\n (click)=\"onOptionClick(option, $event)\"\n >\n <!-- Checkbox in Multiple Mode synced to selection -->\n @if (multiple()) {\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2 mt-0\"\n style=\"pointer-events: none\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n />\n }\n @if (itemTemplate) {\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: option }\"\n ></ng-container>\n } @else {\n <span>{{ resolveOptionLabel(option) }}</span>\n }\n </button>\n }\n </div>\n }\n } @else {\n @for (option of filteredOptions(); track option; let i = $index) {\n <button\n type=\"button\"\n class=\"dropdown-item d-flex align-items-center py-2 px-3\"\n [class.active]=\"!multiple() && isSelected(option)\"\n [class.bg-light]=\"multiple() && isSelected(option)\"\n [class.fw-semibold]=\"multiple() && isSelected(option)\"\n [class.focus]=\"isOptionFocused(option)\"\n [class.bg-body-secondary]=\"isOptionFocused(option) && !isSelected(option)\"\n [class.disabled]=\"isOptionDisabled(option)\"\n [disabled]=\"isOptionDisabled(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-checked]=\"multiple() ? isSelected(option) : null\"\n (click)=\"onOptionClick(option, $event)\"\n >\n <!-- Checkbox in Multiple Mode synced to selection -->\n @if (multiple()) {\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2 mt-0\"\n style=\"pointer-events: none\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n />\n }\n @if (itemTemplate) {\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: option }\"\n ></ng-container>\n } @else {\n <span>{{ resolveOptionLabel(option) }}</span>\n }\n </button>\n }\n }\n\n <!-- Empty State Message -->\n @if (isOptionsEmpty()) {\n <div class=\"dropdown-item text-muted text-center py-3\">\n @if (emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n } @else {\n <small>{{\n filterValue()\n ? emptyFilterMessage() || 'No results found'\n : emptyMessage() || 'No results found'\n }}</small>\n }\n </div>\n }\n </ng-template>\n\n @if (isModalMode()) {\n <!-- Bootstrap Modal Overlay -->\n @if (overlayVisible()) {\n <div\n class=\"modal fade show d-block\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n style=\"background-color: rgba(0, 0, 0, 0.45); z-index: 1075\"\n (click)=\"closeOverlay($event)\"\n >\n <div\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\"\n role=\"document\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"modal-content shadow\" [ngClass]=\"panelStyleClass()\" [ngStyle]=\"panelStyle()\">\n <!-- Modal Header -->\n <div class=\"modal-header bg-light bg-opacity-50 py-2 px-3\">\n <h6 class=\"modal-title m-0 fw-semibold text-truncate\">{{ effectivePopupTitle() }}</h6>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n (click)=\"closeOverlay($event)\"\n ></button>\n </div>\n\n <!-- Modal Body (Options Content) -->\n <div\n class=\"modal-body p-0\"\n #dropdownMenu\n role=\"listbox\"\n (scroll)=\"onOverlayScroll($event)\"\n >\n <ng-container *ngTemplateOutlet=\"dropdownContent\"></ng-container>\n </div>\n\n <!-- Modal Footer (Custom Template or Done Button) -->\n @if (footerTemplate || multiple()) {\n <div\n class=\"modal-footer p-2 bg-light bg-opacity-50 d-flex align-items-center justify-content-end\"\n >\n @if (footerTemplate) {\n <div class=\"w-100\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary px-3\"\n (click)=\"closeOverlay($event)\"\n >\n Done\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n } @else {\n <!-- Standard Dropdown Menu -->\n <div\n #dropdownMenu\n class=\"dropdown-menu shadow-sm p-0\"\n [class.show]=\"overlayVisible()\"\n [ngStyle]=\"panelStyle()\"\n [ngClass]=\"panelStyleClass()\"\n [style.max-height]=\"scrollHeight()\"\n style=\"overflow-y: auto\"\n role=\"listbox\"\n (scroll)=\"onOverlayScroll($event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <ng-container *ngTemplateOutlet=\"dropdownContent\"></ng-container>\n\n <!-- Footer Template -->\n @if (footerTemplate) {\n <div class=\"p-2 border-top\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@amro93/ngb-select",
3
+ "version": "0.1.1",
4
+ "description": "Lightweight, accessible, standalone Angular Select dropdown component built with pure Bootstrap 5",
5
+ "keywords": [
6
+ "angular",
7
+ "angular-select",
8
+ "bootstrap",
9
+ "bootstrap-5",
10
+ "select",
11
+ "dropdown",
12
+ "combobox",
13
+ "standalone",
14
+ "ngb-select"
15
+ ],
16
+ "author": "amro93",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/amro93/ngb-select.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/amro93/ngb-select/issues"
23
+ },
24
+ "homepage": "https://github.com/amro93/ngb-select#readme",
25
+ "license": "MIT",
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "peerDependencies": {
30
+ "@angular/common": ">=18.0.0",
31
+ "@angular/core": ">=18.0.0",
32
+ "@angular/forms": ">=18.0.0",
33
+ "bootstrap": ">=5.0.0"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "bootstrap": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "tslib": "^2.3.0"
42
+ },
43
+ "sideEffects": false,
44
+ "module": "fesm2022/amro93-ngb-select.mjs",
45
+ "typings": "types/amro93-ngb-select.d.ts",
46
+ "exports": {
47
+ "./package.json": {
48
+ "default": "./package.json"
49
+ },
50
+ ".": {
51
+ "types": "./types/amro93-ngb-select.d.ts",
52
+ "default": "./fesm2022/amro93-ngb-select.mjs"
53
+ }
54
+ },
55
+ "type": "module"
56
+ }
@@ -0,0 +1,221 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, OnDestroy, ElementRef, TemplateRef, ChangeDetectorRef } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+
5
+ type SelectSize = 'small' | 'medium' | 'large';
6
+ type SelectDisplayMode = 'comma' | 'chip';
7
+ type SelectVariant = 'filled' | 'outlined';
8
+ type SelectFilterMatchMode = 'contains' | 'startsWith' | 'endsWith' | 'equals' | 'notEquals';
9
+ type FocusOnOpenStrategy = 'always' | 'notSelected';
10
+ type FloatLabelVariant = 'on' | 'in' | 'over';
11
+ type DropdownDirection = 'auto' | 'up' | 'down' | 'top' | 'bottom';
12
+ type DropdownPosition = DropdownDirection;
13
+ type SelectDropdownPosition = DropdownDirection;
14
+ interface SelectOption {
15
+ label?: string;
16
+ value?: any;
17
+ disabled?: boolean;
18
+ styleClass?: string;
19
+ icon?: string;
20
+ title?: string;
21
+ items?: SelectOption[];
22
+ [key: string]: any;
23
+ }
24
+ interface SelectChangeEvent<T = any> {
25
+ originalEvent: Event | null;
26
+ value: T;
27
+ }
28
+ interface SelectFilterEvent {
29
+ originalEvent: Event;
30
+ filter: string;
31
+ }
32
+ interface SelectSelectAllChangeEvent {
33
+ originalEvent: Event;
34
+ checked: boolean;
35
+ }
36
+ interface SelectRemoveChipEvent {
37
+ originalEvent: Event;
38
+ value: any;
39
+ }
40
+ interface SelectLazyLoadEvent {
41
+ first: number;
42
+ last: number;
43
+ [key: string]: any;
44
+ }
45
+ declare const NGB_SELECT_VERSION = "0.1.1";
46
+
47
+ declare class NgbSelectComponent implements ControlValueAccessor, OnInit, OnDestroy {
48
+ elementRef: ElementRef;
49
+ private cdr;
50
+ static readonly VERSION = "0.1.1";
51
+ options: _angular_core.InputSignal<any[]>;
52
+ optionLabel: _angular_core.InputSignal<string>;
53
+ optionValue: _angular_core.InputSignal<string>;
54
+ optionDisabled: _angular_core.InputSignal<string>;
55
+ optionGroupLabel: _angular_core.InputSignal<string>;
56
+ optionGroupChildren: _angular_core.InputSignal<string>;
57
+ group: _angular_core.InputSignal<boolean>;
58
+ dataKey: _angular_core.InputSignal<string | undefined>;
59
+ placeholder: _angular_core.InputSignal<string | undefined>;
60
+ multiple: _angular_core.InputSignal<boolean>;
61
+ display: _angular_core.InputSignal<SelectDisplayMode>;
62
+ showSelectAll: _angular_core.InputSignal<boolean>;
63
+ maxSelectedLabels: _angular_core.InputSignal<number>;
64
+ selectedItemsLabel: _angular_core.InputSignal<string>;
65
+ selectionLimit: _angular_core.InputSignal<number | undefined>;
66
+ closeOnSelect: _angular_core.InputSignal<boolean>;
67
+ filter: _angular_core.InputSignal<boolean>;
68
+ filterBy: _angular_core.InputSignal<string | undefined>;
69
+ filterMatchMode: _angular_core.InputSignal<SelectFilterMatchMode>;
70
+ filterLocale: _angular_core.InputSignal<string | undefined>;
71
+ filterNormalizeArabic: _angular_core.InputSignal<boolean>;
72
+ filterPlaceholder: _angular_core.InputSignal<string | undefined>;
73
+ searchPlaceholder: _angular_core.InputSignal<string | undefined>;
74
+ filterInTrigger: _angular_core.InputSignal<boolean>;
75
+ resetFilterOnHide: _angular_core.InputSignal<boolean>;
76
+ emptyMessage: _angular_core.InputSignal<string>;
77
+ emptyFilterMessage: _angular_core.InputSignal<string>;
78
+ disabled: _angular_core.ModelSignal<boolean>;
79
+ readonly: _angular_core.InputSignal<boolean>;
80
+ loading: _angular_core.InputSignal<boolean>;
81
+ showClear: _angular_core.InputSignal<boolean>;
82
+ invalid: _angular_core.InputSignal<boolean>;
83
+ floatLabel: _angular_core.InputSignal<boolean>;
84
+ floatLabelVariant: _angular_core.InputSignal<FloatLabelVariant>;
85
+ autofocus: _angular_core.InputSignal<boolean>;
86
+ tabindex: _angular_core.InputSignal<number>;
87
+ id: _angular_core.InputSignal<string | undefined>;
88
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
89
+ ariaLabelledBy: _angular_core.InputSignal<string | undefined>;
90
+ dir: _angular_core.InputSignal<"auto" | "ltr" | "rtl" | undefined>;
91
+ dropdownPosition: _angular_core.InputSignal<DropdownDirection>;
92
+ dropdownDirection: _angular_core.InputSignal<DropdownDirection | undefined>;
93
+ direction: _angular_core.InputSignal<DropdownDirection | undefined>;
94
+ size: _angular_core.InputSignal<SelectSize | undefined>;
95
+ variant: _angular_core.InputSignal<SelectVariant>;
96
+ fluid: _angular_core.InputSignal<boolean>;
97
+ scrollHeight: _angular_core.InputSignal<string>;
98
+ style: _angular_core.InputSignal<{
99
+ [klass: string]: any;
100
+ } | null | undefined>;
101
+ styleClass: _angular_core.InputSignal<string | undefined>;
102
+ panelStyle: _angular_core.InputSignal<{
103
+ [klass: string]: any;
104
+ } | null | undefined>;
105
+ panelStyleClass: _angular_core.InputSignal<string | undefined>;
106
+ appendTo: _angular_core.InputSignal<string | HTMLElement | undefined>;
107
+ modal: _angular_core.InputSignal<boolean>;
108
+ popup: _angular_core.InputSignal<boolean>;
109
+ touchUI: _angular_core.InputSignal<boolean>;
110
+ popupTitle: _angular_core.InputSignal<string | undefined>;
111
+ modalTitle: _angular_core.InputSignal<string | undefined>;
112
+ editable: _angular_core.InputSignal<boolean>;
113
+ maxLength: _angular_core.InputSignal<number | undefined>;
114
+ selectOnFocus: _angular_core.InputSignal<boolean>;
115
+ autoOptionFocus: _angular_core.InputSignal<boolean>;
116
+ focusOnOpen: _angular_core.InputSignal<number | undefined>;
117
+ focusOnOpenStrategy: _angular_core.InputSignal<FocusOnOpenStrategy>;
118
+ lazy: _angular_core.InputSignal<boolean>;
119
+ overlayVisible: _angular_core.ModelSignal<boolean>;
120
+ onChange: _angular_core.OutputEmitterRef<SelectChangeEvent<any>>;
121
+ onFilter: _angular_core.OutputEmitterRef<SelectFilterEvent>;
122
+ onFocus: _angular_core.OutputEmitterRef<Event>;
123
+ onBlur: _angular_core.OutputEmitterRef<Event>;
124
+ onShow: _angular_core.OutputEmitterRef<Event | null>;
125
+ onHide: _angular_core.OutputEmitterRef<Event | null>;
126
+ onClear: _angular_core.OutputEmitterRef<Event>;
127
+ onSelectAllChange: _angular_core.OutputEmitterRef<SelectSelectAllChangeEvent>;
128
+ onRemoveChip: _angular_core.OutputEmitterRef<SelectRemoveChipEvent>;
129
+ onLazyLoad: _angular_core.OutputEmitterRef<SelectLazyLoadEvent>;
130
+ itemTemplate?: TemplateRef<any>;
131
+ selectedItemTemplate?: TemplateRef<any>;
132
+ labelTemplate?: TemplateRef<any>;
133
+ chipTemplate?: TemplateRef<any>;
134
+ headerCheckboxTemplate?: TemplateRef<any>;
135
+ headerTemplate?: TemplateRef<any>;
136
+ footerTemplate?: TemplateRef<any>;
137
+ groupTemplate?: TemplateRef<any>;
138
+ emptyTemplate?: TemplateRef<any>;
139
+ clearIconTemplate?: TemplateRef<any>;
140
+ dropdownIconTemplate?: TemplateRef<any>;
141
+ filterIconTemplate?: TemplateRef<any>;
142
+ filterInputElement?: ElementRef<HTMLInputElement>;
143
+ triggerFilterInputElement?: ElementRef<HTMLInputElement>;
144
+ editableInputElement?: ElementRef<HTMLInputElement>;
145
+ dropdownMenuElement?: ElementRef<HTMLDivElement>;
146
+ effectiveSearchPlaceholder: _angular_core.Signal<string>;
147
+ effectiveDropdownPosition: _angular_core.Signal<DropdownDirection>;
148
+ currentPlacement: _angular_core.WritableSignal<"top" | "bottom">;
149
+ isDropup: _angular_core.Signal<boolean>;
150
+ isModalMode: _angular_core.Signal<boolean>;
151
+ effectivePopupTitle: _angular_core.Signal<string>;
152
+ effectiveFilterValue: _angular_core.Signal<string>;
153
+ value: _angular_core.WritableSignal<any>;
154
+ filteredOptions: _angular_core.WritableSignal<any[]>;
155
+ filterValue: _angular_core.WritableSignal<string>;
156
+ focusedIndex: _angular_core.WritableSignal<number>;
157
+ selectAll: _angular_core.WritableSignal<boolean | null>;
158
+ private onModelChange;
159
+ private onModelTouched;
160
+ constructor(elementRef: ElementRef, cdr: ChangeDetectorRef);
161
+ ngOnInit(): void;
162
+ ngOnDestroy(): void;
163
+ safeOptions: _angular_core.Signal<any[]>;
164
+ writeValue(obj: any): void;
165
+ registerOnChange(fn: any): void;
166
+ registerOnTouched(fn: any): void;
167
+ setDisabledState(isDisabled: boolean): void;
168
+ hasSelectedValue: _angular_core.Signal<boolean>;
169
+ getDisplayLabel(): string;
170
+ resolveOptionLabelByValue(val: any): string;
171
+ resolveOptionLabel(option: any): string;
172
+ resolveOptionValue(option: any): any;
173
+ isOptionDisabled(option: any): boolean;
174
+ resolveOptionGroupLabel(groupOption: any): string;
175
+ resolveOptionGroupChildren(groupOption: any): any[];
176
+ findOptionByValue(val: any): any;
177
+ areValuesEqual(val1: any, val2: any): boolean;
178
+ isSelected(option: any): boolean;
179
+ isOptionsEmpty(): boolean;
180
+ onTriggerClick(event: MouseEvent): void;
181
+ calculateDropdownPosition(): void;
182
+ toggleOverlay(event?: Event): void;
183
+ openOverlay(event?: Event): void;
184
+ closeOverlay(event?: Event): void;
185
+ private handleFocusOnOpen;
186
+ onOptionClick(option: any, event: Event): void;
187
+ removeChip(val: any, event: Event): void;
188
+ toggleSelectAll(event: Event): void;
189
+ updateSelectAllState(): void;
190
+ private updateModel;
191
+ onClearClick(event: Event): void;
192
+ onEditableInput(event: Event): void;
193
+ onEditableFocus(event: FocusEvent): void;
194
+ onFilterChange(event: Event): void;
195
+ updateFilteredOptions(): void;
196
+ private matchesFilter;
197
+ private getFilterFields;
198
+ private resolveFieldData;
199
+ private normalizeArabicText;
200
+ private compareStrings;
201
+ getFlatFilteredOptions(): any[];
202
+ onKeydown(event: KeyboardEvent): void;
203
+ onFilterKeydown(event: KeyboardEvent): void;
204
+ private navigateOption;
205
+ isOptionFocused(option: any): boolean;
206
+ onOverlayScroll(event: Event): void;
207
+ private handleAppendTo;
208
+ private repositionOverlay;
209
+ private cleanAppendTo;
210
+ onTriggerFocus(event: FocusEvent): void;
211
+ onTriggerBlur(event: FocusEvent): void;
212
+ focus(): void;
213
+ onWindowResize(): void;
214
+ onWindowScroll(): void;
215
+ onDocumentClick(event: MouseEvent): void;
216
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgbSelectComponent, never>;
217
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgbSelectComponent, "ngb-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "optionGroupLabel": { "alias": "optionGroupLabel"; "required": false; "isSignal": true; }; "optionGroupChildren": { "alias": "optionGroupChildren"; "required": false; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "maxSelectedLabels": { "alias": "maxSelectedLabels"; "required": false; "isSignal": true; }; "selectedItemsLabel": { "alias": "selectedItemsLabel"; "required": false; "isSignal": true; }; "selectionLimit": { "alias": "selectionLimit"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "filterBy": { "alias": "filterBy"; "required": false; "isSignal": true; }; "filterMatchMode": { "alias": "filterMatchMode"; "required": false; "isSignal": true; }; "filterLocale": { "alias": "filterLocale"; "required": false; "isSignal": true; }; "filterNormalizeArabic": { "alias": "filterNormalizeArabic"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "filterInTrigger": { "alias": "filterInTrigger"; "required": false; "isSignal": true; }; "resetFilterOnHide": { "alias": "resetFilterOnHide"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyFilterMessage": { "alias": "emptyFilterMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "floatLabelVariant": { "alias": "floatLabelVariant"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "tabindex": { "alias": "tabindex"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "dir": { "alias": "dir"; "required": false; "isSignal": true; }; "dropdownPosition": { "alias": "dropdownPosition"; "required": false; "isSignal": true; }; "dropdownDirection": { "alias": "dropdownDirection"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "fluid": { "alias": "fluid"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "style": { "alias": "style"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; "panelStyle": { "alias": "panelStyle"; "required": false; "isSignal": true; }; "panelStyleClass": { "alias": "panelStyleClass"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "popup": { "alias": "popup"; "required": false; "isSignal": true; }; "touchUI": { "alias": "touchUI"; "required": false; "isSignal": true; }; "popupTitle": { "alias": "popupTitle"; "required": false; "isSignal": true; }; "modalTitle": { "alias": "modalTitle"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; "isSignal": true; }; "autoOptionFocus": { "alias": "autoOptionFocus"; "required": false; "isSignal": true; }; "focusOnOpen": { "alias": "focusOnOpen"; "required": false; "isSignal": true; }; "focusOnOpenStrategy": { "alias": "focusOnOpenStrategy"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "overlayVisible": { "alias": "overlayVisible"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "overlayVisible": "overlayVisibleChange"; "onChange": "onChange"; "onFilter": "onFilter"; "onFocus": "onFocus"; "onBlur": "onBlur"; "onShow": "onShow"; "onHide": "onHide"; "onClear": "onClear"; "onSelectAllChange": "onSelectAllChange"; "onRemoveChip": "onRemoveChip"; "onLazyLoad": "onLazyLoad"; }, ["itemTemplate", "selectedItemTemplate", "labelTemplate", "chipTemplate", "headerCheckboxTemplate", "headerTemplate", "footerTemplate", "groupTemplate", "emptyTemplate", "clearIconTemplate", "dropdownIconTemplate", "filterIconTemplate"], never, true, never>;
218
+ }
219
+
220
+ export { NGB_SELECT_VERSION, NgbSelectComponent };
221
+ export type { DropdownDirection, DropdownPosition, FloatLabelVariant, FocusOnOpenStrategy, SelectChangeEvent, SelectDisplayMode, SelectDropdownPosition, SelectFilterEvent, SelectFilterMatchMode, SelectLazyLoadEvent, SelectOption, SelectRemoveChipEvent, SelectSelectAllChangeEvent, SelectSize, SelectVariant };