import * as i1 from '@angular/common'; import { CommonModule } from '@angular/common'; import * as i0 from '@angular/core'; import { forwardRef, EventEmitter, booleanAttribute, numberAttribute, Component, Input, Output, signal, computed, effect, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, ContentChildren, NgModule } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i3 from 'primeng/api'; import { TranslationKeys, PrimeTemplate, SharedModule } from 'primeng/api'; import * as i7 from 'primeng/autofocus'; import { AutoFocusModule } from 'primeng/autofocus'; import { DomHandler } from 'primeng/dom'; import * as i4 from 'primeng/overlay'; import { OverlayModule } from 'primeng/overlay'; import * as i2 from 'primeng/ripple'; import { RippleModule } from 'primeng/ripple'; import * as i6 from 'primeng/scroller'; import { ScrollerModule } from 'primeng/scroller'; import * as i5 from 'primeng/tooltip'; import { TooltipModule } from 'primeng/tooltip'; import { ObjectUtils, UniqueComponentId } from 'primeng/utils'; import { TimesIcon } from 'primeng/icons/times'; import { CheckIcon } from 'primeng/icons/check'; import { BlankIcon } from 'primeng/icons/blank'; import { ChevronDownIcon } from 'primeng/icons/chevrondown'; import { SearchIcon } from 'primeng/icons/search'; const DROPDOWN_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Dropdown), multi: true }; class DropdownItem { id; option; selected; focused; label; disabled; visible; itemSize; ariaPosInset; ariaSetSize; template; checkmark; onClick = new EventEmitter(); onMouseEnter = new EventEmitter(); ngOnInit() { } onOptionClick(event) { this.onClick.emit(event); } onOptionMouseEnter(event) { this.onMouseEnter.emit(event); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: DropdownItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.7", type: DropdownItem, selector: "p-dropdownItem", inputs: { id: "id", option: "option", selected: ["selected", "selected", booleanAttribute], focused: ["focused", "focused", booleanAttribute], label: "label", disabled: ["disabled", "disabled", booleanAttribute], visible: ["visible", "visible", booleanAttribute], itemSize: ["itemSize", "itemSize", numberAttribute], ariaPosInset: "ariaPosInset", ariaSetSize: "ariaSetSize", template: "template", checkmark: ["checkmark", "checkmark", booleanAttribute] }, outputs: { onClick: "onClick", onMouseEnter: "onMouseEnter" }, host: { classAttribute: "p-element" }, ngImport: i0, template: `
  • {{ label ?? 'empty' }}
  • `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => i1.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(() => i2.Ripple), selector: "[pRipple]" }, { kind: "component", type: i0.forwardRef(() => BlankIcon), selector: "BlankIcon" }, { kind: "component", type: i0.forwardRef(() => CheckIcon), selector: "CheckIcon" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: DropdownItem, decorators: [{ type: Component, args: [{ selector: 'p-dropdownItem', template: `
  • {{ label ?? 'empty' }}
  • `, host: { class: 'p-element' } }] }], propDecorators: { id: [{ type: Input }], option: [{ type: Input }], selected: [{ type: Input, args: [{ transform: booleanAttribute }] }], focused: [{ type: Input, args: [{ transform: booleanAttribute }] }], label: [{ type: Input }], disabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], visible: [{ type: Input, args: [{ transform: booleanAttribute }] }], itemSize: [{ type: Input, args: [{ transform: numberAttribute }] }], ariaPosInset: [{ type: Input }], ariaSetSize: [{ type: Input }], template: [{ type: Input }], checkmark: [{ type: Input, args: [{ transform: booleanAttribute }] }], onClick: [{ type: Output }], onMouseEnter: [{ type: Output }] } }); /** * Dropdown also known as Select, is used to choose an item from a collection of options. * @group Components */ class Dropdown { el; renderer; cd; zone; filterService; config; /** * Unique identifier of the component * @group Props */ id; /** * Height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. * @group Props */ scrollHeight = '200px'; /** * When specified, displays an input field to filter the items on keyup. * @group Props */ filter; /** * Name of the input element. * @group Props */ name; /** * Inline style of the element. * @group Props */ style; /** * Inline style of the overlay panel element. * @group Props */ panelStyle; /** * Style class of the element. * @group Props */ styleClass; /** * Style class of the overlay panel element. * @group Props */ panelStyleClass; /** * When present, it specifies that the component cannot be edited. * @group Props */ readonly; /** * When present, it specifies that an input field must be filled out before submitting the form. * @group Props */ required; /** * When present, custom value instead of predefined options can be entered using the editable input field. * @group Props */ editable; /** * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). * @group Props */ appendTo; /** * Index of the element in tabbing order. * @group Props */ tabindex = 0; /** * Default text to display when no option is selected. * @group Props */ set placeholder(val) { this._placeholder.set(val); } get placeholder() { return this._placeholder.asReadonly(); } /** * Icon to display in loading state. * @group Props */ loadingIcon; /** * Placeholder text to show when filter input is empty. * @group Props */ filterPlaceholder; /** * Locale to use in filtering. The default locale is the host environment's current locale. * @group Props */ filterLocale; /** * Specifies the input variant of the component. * @group Props */ variant = 'outlined'; /** * Identifier of the accessible input element. * @group Props */ inputId; /** * A property to uniquely identify a value in options. * @group Props */ dataKey; /** * When filtering is enabled, filterBy decides which field or fields (comma separated) to search against. * @group Props */ filterBy; /** * Fields used when filtering the options, defaults to optionLabel. * @group Props */ filterFields; /** * When present, it specifies that the component should automatically get focus on load. * @group Props */ autofocus; /** * Clears the filter value when hiding the dropdown. * @group Props */ resetFilterOnHide = false; /** * Whether the selected option will be shown with a check mark. * @group Props */ checkmark = false; /** * Icon class of the dropdown icon. * @group Props */ dropdownIcon; /** * Whether the dropdown is in loading state. * @group Props */ loading = false; /** * Name of the label field of an option. * @group Props */ optionLabel; /** * Name of the value field of an option. * @group Props */ optionValue; /** * Name of the disabled field of an option. * @group Props */ optionDisabled; /** * Name of the label field of an option group. * @group Props */ optionGroupLabel = 'label'; /** * Name of the options field of an option group. * @group Props */ optionGroupChildren = 'items'; /** * Whether to display the first item as the label if no placeholder is defined and value is null. * @deprecated since v17.3.0, set initial value by model instead. * @group Props */ autoDisplayFirst = true; /** * Whether to display options as grouped when nested options are provided. * @group Props */ group; /** * When enabled, a clear icon is displayed to clear the value. * @group Props */ showClear; /** * Text to display when filtering does not return any results. Defaults to global value in i18n translation configuration. * @group Props */ emptyFilterMessage = ''; /** * Text to display when there is no data. Defaults to global value in i18n translation configuration. * @group Props */ emptyMessage = ''; /** * Defines if data is loaded and interacted with in lazy manner. * @group Props */ lazy = false; /** * Whether the data should be loaded on demand during scroll. * @group Props */ virtualScroll; /** * Height of an item in the list for VirtualScrolling. * @group Props */ virtualScrollItemSize; /** * Whether to use the scroller feature. The properties of scroller component can be used like an object in it. * @group Props */ virtualScrollOptions; /** * Whether to use overlay API feature. The properties of overlay API can be used like an object in it. * @group Props */ overlayOptions; /** * Defines a string that labels the filter input. * @group Props */ ariaFilterLabel; /** * Used to define a aria label attribute the current element. * @group Props */ ariaLabel; /** * Establishes relationships between the component and label(s) where its value should be one or more element IDs. * @group Props */ ariaLabelledBy; /** * Defines how the items are filtered. * @group Props */ filterMatchMode = 'contains'; /** * Maximum number of character allows in the editable input field. * @group Props */ maxlength; /** * Advisory information to display in a tooltip on hover. * @group Props */ tooltip = ''; /** * Position of the tooltip. * @group Props */ tooltipPosition = 'right'; /** * Type of CSS position. * @group Props */ tooltipPositionStyle = 'absolute'; /** * Style class of the tooltip. * @group Props */ tooltipStyleClass; /** * Fields used when filtering the options, defaults to optionLabel. * @group Props */ focusOnHover = false; /** * Determines if the option will be selected on focus. * @group Props */ selectOnFocus = false; /** * Whether to focus on the first visible or selected element when the overlay panel is shown. * @group Props */ autoOptionFocus = true; /** * Applies focus to the filter element when the overlay is shown. * @group Props */ autofocusFilter = true; /** * When present, it specifies that the component should be disabled. * @group Props */ get disabled() { return this._disabled; } set disabled(_disabled) { if (_disabled) { this.focused = false; if (this.overlayVisible) this.hide(); } this._disabled = _disabled; if (!this.cd.destroyed) { this.cd.detectChanges(); } } /** * Item size of item to be virtual scrolled. * @group Props * @deprecated use virtualScrollItemSize property instead. */ get itemSize() { return this._itemSize; } set itemSize(val) { this._itemSize = val; console.warn('The itemSize property is deprecated, use virtualScrollItemSize property instead.'); } _itemSize; /** * Whether to automatically manage layering. * @group Props * @deprecated since v14.2.0, use overlayOptions property instead. */ get autoZIndex() { return this._autoZIndex; } set autoZIndex(val) { this._autoZIndex = val; console.warn('The autoZIndex property is deprecated since v14.2.0, use overlayOptions property instead.'); } _autoZIndex; /** * Base zIndex value to use in layering. * @group Props * @deprecated since v14.2.0, use overlayOptions property instead. */ get baseZIndex() { return this._baseZIndex; } set baseZIndex(val) { this._baseZIndex = val; console.warn('The baseZIndex property is deprecated since v14.2.0, use overlayOptions property instead.'); } _baseZIndex; /** * Transition options of the show animation. * @group Props * @deprecated since v14.2.0, use overlayOptions property instead. */ get showTransitionOptions() { return this._showTransitionOptions; } set showTransitionOptions(val) { this._showTransitionOptions = val; console.warn('The showTransitionOptions property is deprecated since v14.2.0, use overlayOptions property instead.'); } _showTransitionOptions; /** * Transition options of the hide animation. * @group Props * @deprecated since v14.2.0, use overlayOptions property instead. */ get hideTransitionOptions() { return this._hideTransitionOptions; } set hideTransitionOptions(val) { this._hideTransitionOptions = val; console.warn('The hideTransitionOptions property is deprecated since v14.2.0, use overlayOptions property instead.'); } _hideTransitionOptions; /** * When specified, filter displays with this value. * @group Props */ get filterValue() { return this._filterValue(); } set filterValue(val) { setTimeout(() => { this._filterValue.set(val); }); } /** * An array of objects to display as the available options. * @group Props */ get options() { const options = this._options(); return options; } set options(val) { if (!ObjectUtils.deepEquals(val, this._options())) { this._options.set(val); } } /** * Callback to invoke when value of dropdown changes. * @param {DropdownChangeEvent} event - custom change event. * @group Emits */ onChange = new EventEmitter(); /** * Callback to invoke when data is filtered. * @param {DropdownFilterEvent} event - custom filter event. * @group Emits */ onFilter = new EventEmitter(); /** * Callback to invoke when dropdown gets focus. * @param {Event} event - Browser event. * @group Emits */ onFocus = new EventEmitter(); /** * Callback to invoke when dropdown loses focus. * @param {Event} event - Browser event. * @group Emits */ onBlur = new EventEmitter(); /** * Callback to invoke when component is clicked. * @param {MouseEvent} event - Mouse event. * @group Emits */ onClick = new EventEmitter(); /** * Callback to invoke when dropdown overlay gets visible. * @param {AnimationEvent} event - Animation event. * @group Emits */ onShow = new EventEmitter(); /** * Callback to invoke when dropdown overlay gets hidden. * @param {AnimationEvent} event - Animation event. * @group Emits */ onHide = new EventEmitter(); /** * Callback to invoke when dropdown clears the value. * @param {Event} event - Browser event. * @group Emits */ onClear = new EventEmitter(); /** * Callback to invoke in lazy mode to load new data. * @param {DropdownLazyLoadEvent} event - Lazy load event. * @group Emits */ onLazyLoad = new EventEmitter(); containerViewChild; filterViewChild; focusInputViewChild; editableInputViewChild; itemsViewChild; scroller; overlayViewChild; firstHiddenFocusableElementOnOverlay; lastHiddenFocusableElementOnOverlay; templates; _disabled; itemsWrapper; itemTemplate; groupTemplate; loaderTemplate; selectedItemTemplate; headerTemplate; filterTemplate; footerTemplate; emptyFilterTemplate; emptyTemplate; dropdownIconTemplate; loadingIconTemplate; clearIconTemplate; filterIconTemplate; filterOptions; _options = signal(null); _placeholder = signal(undefined); modelValue = signal(null); value; onModelChange = () => { }; onModelTouched = () => { }; hover; focused; overlayVisible; optionsChanged; panel; dimensionsUpdated; hoveredItem; selectedOptionUpdated; _filterValue = signal(null); searchValue; searchIndex; searchTimeout; previousSearchChar; currentSearchChar; preventModelTouched; focusedOptionIndex = signal(-1); labelId; listId; clicked = signal(false); get emptyMessageLabel() { return this.emptyMessage || this.config.getTranslation(TranslationKeys.EMPTY_MESSAGE); } get emptyFilterMessageLabel() { return this.emptyFilterMessage || this.config.getTranslation(TranslationKeys.EMPTY_FILTER_MESSAGE); } get isVisibleClearIcon() { return this.modelValue() != null && this.hasSelectedOption() && this.showClear && !this.disabled; } get listLabel() { return this.config.getTranslation(TranslationKeys.ARIA)['listLabel']; } get containerClass() { return { 'p-dropdown p-component p-inputwrapper': true, 'p-disabled': this.disabled, 'p-dropdown-clearable': this.showClear && !this.disabled, 'p-focus': this.focused, 'p-inputwrapper-filled': this.modelValue() !== undefined && this.modelValue() !== null && !this.modelValue().length, 'p-inputwrapper-focus': this.focused || this.overlayVisible, 'p-variant-filled': this.variant === 'filled' || this.config.inputStyle() === 'filled' }; } get inputClass() { const label = this.label(); return { 'p-dropdown-label p-inputtext': true, 'p-placeholder': this.placeholder() && label === this.placeholder(), 'p-dropdown-label-empty': !this.editable && !this.selectedItemTemplate && (label === undefined || label === null || label === 'p-emptylabel' || label.length === 0) }; } get panelClass() { return { 'p-dropdown-panel p-component': true, 'p-input-filled': this.config.inputStyle() === 'filled', 'p-ripple-disabled': this.config.ripple === false }; } get focusedOptionId() { return this.focusedOptionIndex() !== -1 ? `${this.id}_${this.focusedOptionIndex()}` : null; } visibleOptions = computed(() => { const options = this.getAllVisibleAndNonVisibleOptions(); if (this._filterValue()) { const _filterBy = this.filterBy || this.optionLabel; const filteredOptions = !_filterBy && !this.filterFields && !this.optionValue ? this.options.filter((option) => { if (option.label) { return option.label.toString().toLowerCase().indexOf(this._filterValue().toLowerCase().trim()) !== -1; } return option.toString().toLowerCase().indexOf(this._filterValue().toLowerCase().trim()) !== -1; }) : this.filterService.filter(options, this.searchFields(), this._filterValue().trim(), this.filterMatchMode, this.filterLocale); if (this.group) { const optionGroups = this.options || []; const filtered = []; optionGroups.forEach((group) => { const groupChildren = this.getOptionGroupChildren(group); const filteredItems = groupChildren.filter((item) => filteredOptions.includes(item)); if (filteredItems.length > 0) filtered.push({ ...group, [typeof this.optionGroupChildren === 'string' ? this.optionGroupChildren : 'items']: [...filteredItems] }); }); return this.flatOptions(filtered); } return filteredOptions; } return options; }); label = computed(() => { // use getAllVisibleAndNonVisibleOptions verses just visible options // this will find the selected option whether or not the user is currently filtering because the filtered (i.e. visible) options, are a subset of all the options const options = this.getAllVisibleAndNonVisibleOptions(); // use isOptionEqualsModelValue for the use case where the dropdown is initalized with a disabled option const selectedOptionIndex = options.findIndex((option) => this.isOptionValueEqualsModelValue(option)); return selectedOptionIndex !== -1 ? this.getOptionLabel(options[selectedOptionIndex]) : this.placeholder() || 'p-emptylabel'; }); filled = computed(() => { if (typeof this.modelValue() === 'string') return !!this.modelValue(); return this.label() !== 'p-emptylabel' && this.modelValue() !== undefined && this.modelValue() !== null; }); selectedOption; editableInputValue = computed(() => this.getOptionLabel(this.selectedOption) || this.modelValue() || ''); constructor(el, renderer, cd, zone, filterService, config) { this.el = el; this.renderer = renderer; this.cd = cd; this.zone = zone; this.filterService = filterService; this.config = config; effect(() => { const modelValue = this.modelValue(); const visibleOptions = this.visibleOptions(); if (visibleOptions && ObjectUtils.isNotEmpty(visibleOptions)) { const selectedOptionIndex = this.findSelectedOptionIndex(); if (selectedOptionIndex !== -1 || modelValue === undefined || (typeof modelValue === 'string' && modelValue.length === 0) || this.isModelValueNotSet() || this.editable) { this.selectedOption = visibleOptions[selectedOptionIndex]; } } if (ObjectUtils.isEmpty(visibleOptions) && (modelValue === undefined || this.isModelValueNotSet()) && ObjectUtils.isNotEmpty(this.selectedOption)) { this.selectedOption = null; } if (modelValue !== undefined && this.editable) { this.updateEditableLabel(); } this.cd.markForCheck(); }); } isModelValueNotSet() { return this.modelValue() === null && !this.isOptionValueEqualsModelValue(this.selectedOption); } getAllVisibleAndNonVisibleOptions() { return this.group ? this.flatOptions(this.options) : this.options || []; } ngOnInit() { this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); if (this.filterBy) { this.filterOptions = { filter: (value) => this.onFilterInputChange(value), reset: () => this.resetFilter() }; } } ngAfterViewChecked() { if (this.optionsChanged && this.overlayVisible) { this.optionsChanged = false; this.zone.runOutsideAngular(() => { setTimeout(() => { if (this.overlayViewChild) { this.overlayViewChild.alignOverlay(); } }, 1); }); } if (this.selectedOptionUpdated && this.itemsWrapper) { let selectedItem = DomHandler.findSingle(this.overlayViewChild?.overlayViewChild?.nativeElement, 'li.p-highlight'); if (selectedItem) { DomHandler.scrollInView(this.itemsWrapper, selectedItem); } this.selectedOptionUpdated = false; } } ngAfterContentInit() { this.templates.forEach((item) => { switch (item.getType()) { case 'item': this.itemTemplate = item.template; break; case 'selectedItem': this.selectedItemTemplate = item.template; break; case 'header': this.headerTemplate = item.template; break; case 'filter': this.filterTemplate = item.template; break; case 'footer': this.footerTemplate = item.template; break; case 'emptyfilter': this.emptyFilterTemplate = item.template; break; case 'empty': this.emptyTemplate = item.template; break; case 'group': this.groupTemplate = item.template; break; case 'loader': this.loaderTemplate = item.template; break; case 'dropdownicon': this.dropdownIconTemplate = item.template; break; case 'loadingicon': this.loadingIconTemplate = item.template; break; case 'clearicon': this.clearIconTemplate = item.template; break; case 'filtericon': this.filterIconTemplate = item.template; break; default: this.itemTemplate = item.template; break; } }); } flatOptions(options) { return (options || []).reduce((result, option, index) => { result.push({ optionGroup: option, group: true, index }); const optionGroupChildren = this.getOptionGroupChildren(option); optionGroupChildren && optionGroupChildren.forEach((o) => result.push(o)); return result; }, []); } autoUpdateModel() { if (this.selectOnFocus && this.autoOptionFocus && !this.hasSelectedOption()) { this.focusedOptionIndex.set(this.findFirstFocusedOptionIndex()); this.onOptionSelect(null, this.visibleOptions()[this.focusedOptionIndex()], false); } if (this.autoDisplayFirst && (this.modelValue() === null || this.modelValue() === undefined)) { if (!this.placeholder()) { const ind = this.findFirstOptionIndex(); this.onOptionSelect(null, this.visibleOptions()[ind], false, true); } } } onOptionSelect(event, option, isHide = true, preventChange = false) { if (!this.isSelected(option)) { const value = this.getOptionValue(option); this.updateModel(value, event); this.focusedOptionIndex.set(this.findSelectedOptionIndex()); preventChange === false && this.onChange.emit({ originalEvent: event, value: value }); } if (isHide) { this.hide(true); } } onOptionMouseEnter(event, index) { if (this.focusOnHover) { this.changeFocusedOptionIndex(event, index); } } updateModel(value, event) { this.value = value; this.onModelChange(value); this.modelValue.set(value); this.selectedOptionUpdated = true; } writeValue(value) { if (this.filter) { this.resetFilter(); } this.value = value; this.allowModelChange() && this.onModelChange(value); this.modelValue.set(this.value); this.updateEditableLabel(); this.cd.markForCheck(); } allowModelChange() { return this.autoDisplayFirst && !this.placeholder() && (this.modelValue() === undefined || this.modelValue() === null) && !this.editable && this.options && this.options.length; } isSelected(option) { return this.isValidOption(option) && this.isOptionValueEqualsModelValue(option); } isOptionValueEqualsModelValue(option) { return ObjectUtils.equals(this.modelValue(), this.getOptionValue(option), this.equalityKey()); } ngAfterViewInit() { if (this.editable) { this.updateEditableLabel(); } this.updatePlaceHolderForFloatingLabel(); } updatePlaceHolderForFloatingLabel() { const parentElement = this.el.nativeElement.parentElement; const isInFloatingLabel = parentElement.classList.contains('p-float-label'); if (parentElement && isInFloatingLabel && !this.selectedOption) { const label = parentElement.querySelector('label'); if (label) { this._placeholder.set(label.textContent); } } } updateEditableLabel() { if (this.editableInputViewChild) { this.editableInputViewChild.nativeElement.value = this.getOptionLabel(this.selectedOption) || this.modelValue() || ''; } } clearEditableLabel() { if (this.editableInputViewChild) { this.editableInputViewChild.nativeElement.value = ''; } } getOptionIndex(index, scrollerOptions) { return this.virtualScrollerDisabled ? index : scrollerOptions && scrollerOptions.getItemOptions(index)['index']; } getOptionLabel(option) { return this.optionLabel !== undefined && this.optionLabel !== null ? ObjectUtils.resolveFieldData(option, this.optionLabel) : option && option.label !== undefined ? option.label : option; } getOptionValue(option) { return this.optionValue && this.optionValue !== null ? ObjectUtils.resolveFieldData(option, this.optionValue) : !this.optionLabel && option && option.value !== undefined ? option.value : option; } isOptionDisabled(option) { if (this.getOptionValue(this.modelValue()) === this.getOptionValue(option) || (this.getOptionLabel(this.modelValue() === this.getOptionLabel(option)) && option.disabled === false)) { return false; } else { return this.optionDisabled ? ObjectUtils.resolveFieldData(option, this.optionDisabled) : option && option.disabled !== undefined ? option.disabled : false; } } getOptionGroupLabel(optionGroup) { return this.optionGroupLabel !== undefined && this.optionGroupLabel !== null ? ObjectUtils.resolveFieldData(optionGroup, this.optionGroupLabel) : optionGroup && optionGroup.label !== undefined ? optionGroup.label : optionGroup; } getOptionGroupChildren(optionGroup) { return this.optionGroupChildren !== undefined && this.optionGroupChildren !== null ? ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren) : optionGroup.items; } getAriaPosInset(index) { return ((this.optionGroupLabel ? index - this.visibleOptions() .slice(0, index) .filter((option) => this.isOptionGroup(option)).length : index) + 1); } get ariaSetSize() { return this.visibleOptions().filter((option) => !this.isOptionGroup(option)).length; } /** * Callback to invoke on filter reset. * @group Method */ resetFilter() { this._filterValue.set(null); if (this.filterViewChild && this.filterViewChild.nativeElement) { this.filterViewChild.nativeElement.value = ''; } } registerOnChange(fn) { this.onModelChange = fn; } registerOnTouched(fn) { this.onModelTouched = fn; } setDisabledState(val) { this.disabled = val; this.cd.markForCheck(); } onContainerClick(event) { if (this.disabled || this.readonly || this.loading) { return; } this.focusInputViewChild?.nativeElement.focus({ preventScroll: true }); if (event.target.tagName === 'INPUT' || event.target.getAttribute('data-pc-section') === 'clearicon' || event.target.closest('[data-pc-section="clearicon"]')) { return; } else if (!this.overlayViewChild || !this.overlayViewChild.el.nativeElement.contains(event.target)) { this.overlayVisible ? this.hide(true) : this.show(true); } this.onClick.emit(event); this.clicked.set(true); this.cd.detectChanges(); } isEmpty() { return !this._options() || (this.visibleOptions() && this.visibleOptions().length === 0); } onEditableInput(event) { const value = event.target.value; this.searchValue = ''; const matched = this.searchOptions(event, value); !matched && this.focusedOptionIndex.set(-1); this.onModelChange(value); this.updateModel(value, event); setTimeout(() => { this.onChange.emit({ originalEvent: event, value: value }); }, 1); !this.overlayVisible && ObjectUtils.isNotEmpty(value) && this.show(); } /** * Displays the panel. * @group Method */ show(isFocus) { this.overlayVisible = true; const focusedOptionIndex = this.focusedOptionIndex() !== -1 ? this.focusedOptionIndex() : this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : this.editable ? -1 : this.findSelectedOptionIndex(); this.focusedOptionIndex.set(focusedOptionIndex); if (isFocus) { DomHandler.focus(this.focusInputViewChild?.nativeElement); } this.cd.markForCheck(); } onOverlayAnimationStart(event) { if (event.toState === 'visible') { this.itemsWrapper = DomHandler.findSingle(this.overlayViewChild?.overlayViewChild?.nativeElement, this.virtualScroll ? '.p-scroller' : '.p-dropdown-items-wrapper'); this.virtualScroll && this.scroller?.setContentEl(this.itemsViewChild?.nativeElement); if (this.options && this.options.length) { if (this.virtualScroll) { const selectedIndex = this.modelValue() ? this.focusedOptionIndex() : -1; if (selectedIndex !== -1) { this.scroller?.scrollToIndex(selectedIndex); } } else { let selectedListItem = DomHandler.findSingle(this.itemsWrapper, '.p-dropdown-item.p-highlight'); if (selectedListItem) { selectedListItem.scrollIntoView({ block: 'nearest', inline: 'nearest' }); } } } if (this.filterViewChild && this.filterViewChild.nativeElement) { this.preventModelTouched = true; if (this.autofocusFilter && !this.editable) { this.filterViewChild.nativeElement.focus(); } } this.onShow.emit(event); } if (event.toState === 'void') { this.itemsWrapper = null; this.onModelTouched(); this.onHide.emit(event); } } /** * Hides the panel. * @group Method */ hide(isFocus) { this.overlayVisible = false; this.focusedOptionIndex.set(-1); this.clicked.set(false); this.searchValue = ''; if (this.overlayOptions?.mode === 'modal') { DomHandler.unblockBodyScroll(); } if (this.filter && this.resetFilterOnHide) { this.resetFilter(); } if (isFocus) { if (this.focusInputViewChild) { DomHandler.focus(this.focusInputViewChild?.nativeElement); } if (this.editable && this.editableInputViewChild) { DomHandler.focus(this.editableInputViewChild?.nativeElement); } } this.cd.markForCheck(); } onInputFocus(event) { if (this.disabled) { // For ScreenReaders return; } this.focused = true; const focusedOptionIndex = this.focusedOptionIndex() !== -1 ? this.focusedOptionIndex() : this.overlayVisible && this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : -1; this.focusedOptionIndex.set(focusedOptionIndex); this.overlayVisible && this.scrollInView(this.focusedOptionIndex()); this.onFocus.emit(event); } onInputBlur(event) { this.focused = false; this.onBlur.emit(event); if (!this.preventModelTouched) { this.onModelTouched(); } this.preventModelTouched = false; } onKeyDown(event, search) { if (this.disabled || this.readonly || this.loading) { return; } switch (event.code) { //down case 'ArrowDown': this.onArrowDownKey(event); break; //up case 'ArrowUp': this.onArrowUpKey(event, this.editable); break; case 'ArrowLeft': case 'ArrowRight': this.onArrowLeftKey(event, this.editable); break; case 'Delete': this.onDeleteKey(event); break; case 'Home': this.onHomeKey(event, this.editable); break; case 'End': this.onEndKey(event, this.editable); break; case 'PageDown': this.onPageDownKey(event); break; case 'PageUp': this.onPageUpKey(event); break; //space case 'Space': this.onSpaceKey(event, search); break; //enter case 'Enter': case 'NumpadEnter': this.onEnterKey(event); break; //escape and tab case 'Escape': this.onEscapeKey(event); break; case 'Tab': this.onTabKey(event); break; case 'Backspace': this.onBackspaceKey(event, this.editable); break; case 'ShiftLeft': case 'ShiftRight': //NOOP break; default: if (!event.metaKey && ObjectUtils.isPrintableCharacter(event.key)) { !this.overlayVisible && this.show(); !this.editable && this.searchOptions(event, event.key); } break; } this.clicked.set(false); } onFilterKeyDown(event) { switch (event.code) { case 'ArrowDown': this.onArrowDownKey(event); break; case 'ArrowUp': this.onArrowUpKey(event, true); break; case 'ArrowLeft': case 'ArrowRight': this.onArrowLeftKey(event, true); break; case 'Home': this.onHomeKey(event, true); break; case 'End': this.onEndKey(event, true); break; case 'Enter': case 'NumpadEnter': this.onEnterKey(event, true); break; case 'Escape': this.onEscapeKey(event); break; case 'Tab': this.onTabKey(event, true); break; default: break; } } onFilterBlur(event) { this.focusedOptionIndex.set(-1); } onArrowDownKey(event) { if (!this.overlayVisible) { this.show(); this.editable && this.changeFocusedOptionIndex(event, this.findSelectedOptionIndex()); } else { const optionIndex = this.focusedOptionIndex() !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex()) : this.clicked() ? this.findFirstOptionIndex() : this.findFirstFocusedOptionIndex(); this.changeFocusedOptionIndex(event, optionIndex); } // const optionIndex = this.focusedOptionIndex() !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex()) : this.findFirstFocusedOptionIndex(); // this.changeFocusedOptionIndex(event, optionIndex); // !this.overlayVisible && this.show(); event.preventDefault(); event.stopPropagation(); } changeFocusedOptionIndex(event, index) { if (this.focusedOptionIndex() !== index) { this.focusedOptionIndex.set(index); this.scrollInView(); if (this.selectOnFocus) { const option = this.visibleOptions()[index]; this.onOptionSelect(event, option, false); } } } get virtualScrollerDisabled() { return !this.virtualScroll; } scrollInView(index = -1) { const id = index !== -1 ? `${this.id}_${index}` : this.focusedOptionId; if (this.itemsViewChild && this.itemsViewChild.nativeElement) { const element = DomHandler.findSingle(this.itemsViewChild.nativeElement, `li[id="${id}"]`); if (element) { element.scrollIntoView && element.scrollIntoView({ block: 'nearest', inline: 'nearest' }); } else if (!this.virtualScrollerDisabled) { setTimeout(() => { this.virtualScroll && this.scroller?.scrollToIndex(index !== -1 ? index : this.focusedOptionIndex()); }, 0); } } } hasSelectedOption() { return this.modelValue() !== undefined; } isValidSelectedOption(option) { return this.isValidOption(option) && this.isSelected(option); } equalityKey() { return this.optionValue ? null : this.dataKey; } findFirstFocusedOptionIndex() { const selectedIndex = this.findSelectedOptionIndex(); return selectedIndex < 0 ? this.findFirstOptionIndex() : selectedIndex; } findFirstOptionIndex() { return this.visibleOptions().findIndex((option) => this.isValidOption(option)); } findSelectedOptionIndex() { return this.hasSelectedOption() ? this.visibleOptions().findIndex((option) => this.isValidSelectedOption(option)) : -1; } findNextOptionIndex(index) { const matchedOptionIndex = index < this.visibleOptions().length - 1 ? this.visibleOptions() .slice(index + 1) .findIndex((option) => this.isValidOption(option)) : -1; return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : index; } findPrevOptionIndex(index) { const matchedOptionIndex = index > 0 ? ObjectUtils.findLastIndex(this.visibleOptions().slice(0, index), (option) => this.isValidOption(option)) : -1; return matchedOptionIndex > -1 ? matchedOptionIndex : index; } findLastOptionIndex() { return ObjectUtils.findLastIndex(this.visibleOptions(), (option) => this.isValidOption(option)); } findLastFocusedOptionIndex() { const selectedIndex = this.findSelectedOptionIndex(); return selectedIndex < 0 ? this.findLastOptionIndex() : selectedIndex; } isValidOption(option) { return option !== undefined && option !== null && !(this.isOptionDisabled(option) || this.isOptionGroup(option)); } isOptionGroup(option) { return this.optionGroupLabel !== undefined && this.optionGroupLabel !== null && option.optionGroup !== undefined && option.optionGroup !== null && option.group; } onArrowUpKey(event, pressedInInputText = false) { if (event.altKey && !pressedInInputText) { if (this.focusedOptionIndex() !== -1) { const option = this.visibleOptions()[this.focusedOptionIndex()]; this.onOptionSelect(event, option); } this.overlayVisible && this.hide(); } else { const optionIndex = this.focusedOptionIndex() !== -1 ? this.findPrevOptionIndex(this.focusedOptionIndex()) : this.clicked() ? this.findLastOptionIndex() : this.findLastFocusedOptionIndex(); this.changeFocusedOptionIndex(event, optionIndex); !this.overlayVisible && this.show(); } event.preventDefault(); event.stopPropagation(); } onArrowLeftKey(event, pressedInInputText = false) { pressedInInputText && this.focusedOptionIndex.set(-1); } onDeleteKey(event) { if (this.showClear) { this.clear(event); event.preventDefault(); } } onHomeKey(event, pressedInInputText = false) { if (pressedInInputText) { const target = event.currentTarget; if (event.shiftKey) { target.setSelectionRange(0, target.value.length); } else { target.setSelectionRange(0, 0); this.focusedOptionIndex.set(-1); } } else { this.changeFocusedOptionIndex(event, this.findFirstOptionIndex()); !this.overlayVisible && this.show(); } event.preventDefault(); } onEndKey(event, pressedInInputText = false) { if (pressedInInputText) { const target = event.currentTarget; if (event.shiftKey) { target.setSelectionRange(0, target.value.length); } else { const len = target.value.length; target.setSelectionRange(len, len); this.focusedOptionIndex.set(-1); } } else { this.changeFocusedOptionIndex(event, this.findLastOptionIndex()); !this.overlayVisible && this.show(); } event.preventDefault(); } onPageDownKey(event) { this.scrollInView(this.visibleOptions().length - 1); event.preventDefault(); } onPageUpKey(event) { this.scrollInView(0); event.preventDefault(); } onSpaceKey(event, pressedInInputText = false) { !this.editable && !pressedInInputText && this.onEnterKey(event); } onEnterKey(event, pressedInInput = false) { if (!this.overlayVisible) { this.focusedOptionIndex.set(-1); this.onArrowDownKey(event); } else { if (this.focusedOptionIndex() !== -1) { const option = this.visibleOptions()[this.focusedOptionIndex()]; this.onOptionSelect(event, option); } !pressedInInput && this.hide(); } event.preventDefault(); } onEscapeKey(event) { this.overlayVisible && this.hide(true); event.preventDefault(); } onTabKey(event, pressedInInputText = false) { if (!pressedInInputText) { if (this.overlayVisible && this.hasFocusableElements()) { DomHandler.focus(event.shiftKey ? this.lastHiddenFocusableElementOnOverlay.nativeElement : this.firstHiddenFocusableElementOnOverlay.nativeElement); event.preventDefault(); } else { if (this.focusedOptionIndex() !== -1 && this.overlayVisible) { const option = this.visibleOptions()[this.focusedOptionIndex()]; this.onOptionSelect(event, option); } this.overlayVisible && this.hide(this.filter); } } event.stopPropagation(); } onFirstHiddenFocus(event) { const focusableEl = event.relatedTarget === this.focusInputViewChild?.nativeElement ? DomHandler.getFirstFocusableElement(this.overlayViewChild.el?.nativeElement, ':not(.p-hidden-focusable)') : this.focusInputViewChild?.nativeElement; DomHandler.focus(focusableEl); } onLastHiddenFocus(event) { const focusableEl = event.relatedTarget === this.focusInputViewChild?.nativeElement ? DomHandler.getLastFocusableElement(this.overlayViewChild?.overlayViewChild?.nativeElement, ':not([data-p-hidden-focusable="true"])') : this.focusInputViewChild?.nativeElement; DomHandler.focus(focusableEl); } hasFocusableElements() { return DomHandler.getFocusableElements(this.overlayViewChild.overlayViewChild.nativeElement, ':not([data-p-hidden-focusable="true"])').length > 0; } onBackspaceKey(event, pressedInInputText = false) { if (pressedInInputText) { !this.overlayVisible && this.show(); } } searchFields() { return this.filterBy?.split(',') || this.filterFields || [this.optionLabel]; } searchOptions(event, char) { this.searchValue = (this.searchValue || '') + char; let optionIndex = -1; let matched = false; if (this.focusedOptionIndex() !== -1) { optionIndex = this.visibleOptions() .slice(this.focusedOptionIndex()) .findIndex((option) => this.isOptionMatched(option)); optionIndex = optionIndex === -1 ? this.visibleOptions() .slice(0, this.focusedOptionIndex()) .findIndex((option) => this.isOptionMatched(option)) : optionIndex + this.focusedOptionIndex(); } else { optionIndex = this.visibleOptions().findIndex((option) => this.isOptionMatched(option)); } if (optionIndex !== -1) { matched = true; } if (optionIndex === -1 && this.focusedOptionIndex() === -1) { optionIndex = this.findFirstFocusedOptionIndex(); } if (optionIndex !== -1) { this.changeFocusedOptionIndex(event, optionIndex); } if (this.searchTimeout) { clearTimeout(this.searchTimeout); } this.searchTimeout = setTimeout(() => { this.searchValue = ''; this.searchTimeout = null; }, 500); return matched; } isOptionMatched(option) { return this.isValidOption(option) && this.getOptionLabel(option).toString().toLocaleLowerCase(this.filterLocale).startsWith(this.searchValue.toLocaleLowerCase(this.filterLocale)); } onFilterInputChange(event) { let value = event.target.value; this._filterValue.set(value); this.focusedOptionIndex.set(-1); this.onFilter.emit({ originalEvent: event, filter: this._filterValue() }); !this.virtualScrollerDisabled && this.scroller.scrollToIndex(0); setTimeout(() => { this.overlayViewChild.alignOverlay(); }); this.cd.markForCheck(); } applyFocus() { if (this.editable) DomHandler.findSingle(this.el.nativeElement, '.p-dropdown-label.p-inputtext').focus(); else DomHandler.focus(this.focusInputViewChild?.nativeElement); } /** * Applies focus. * @group Method */ focus() { this.applyFocus(); } /** * Clears the model. * @group Method */ clear(event) { this.updateModel(null, event); this.clearEditableLabel(); this.onModelTouched(); this.onChange.emit({ originalEvent: event, value: this.value }); this.onClear.emit(event); this.resetFilter(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: Dropdown, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.FilterService }, { token: i3.PrimeNGConfig }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.7", type: Dropdown, selector: "p-dropdown", inputs: { id: "id", scrollHeight: "scrollHeight", filter: ["filter", "filter", booleanAttribute], name: "name", style: "style", panelStyle: "panelStyle", styleClass: "styleClass", panelStyleClass: "panelStyleClass", readonly: ["readonly", "readonly", booleanAttribute], required: ["required", "required", booleanAttribute], editable: ["editable", "editable", booleanAttribute], appendTo: "appendTo", tabindex: ["tabindex", "tabindex", numberAttribute], placeholder: "placeholder", loadingIcon: "loadingIcon", filterPlaceholder: "filterPlaceholder", filterLocale: "filterLocale", variant: "variant", inputId: "inputId", dataKey: "dataKey", filterBy: "filterBy", filterFields: "filterFields", autofocus: ["autofocus", "autofocus", booleanAttribute], resetFilterOnHide: ["resetFilterOnHide", "resetFilterOnHide", booleanAttribute], checkmark: ["checkmark", "checkmark", booleanAttribute], dropdownIcon: "dropdownIcon", loading: ["loading", "loading", booleanAttribute], optionLabel: "optionLabel", optionValue: "optionValue", optionDisabled: "optionDisabled", optionGroupLabel: "optionGroupLabel", optionGroupChildren: "optionGroupChildren", autoDisplayFirst: ["autoDisplayFirst", "autoDisplayFirst", booleanAttribute], group: ["group", "group", booleanAttribute], showClear: ["showClear", "showClear", booleanAttribute], emptyFilterMessage: "emptyFilterMessage", emptyMessage: "emptyMessage", lazy: ["lazy", "lazy", booleanAttribute], virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], virtualScrollItemSize: ["virtualScrollItemSize", "virtualScrollItemSize", numberAttribute], virtualScrollOptions: "virtualScrollOptions", overlayOptions: "overlayOptions", ariaFilterLabel: "ariaFilterLabel", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", filterMatchMode: "filterMatchMode", maxlength: ["maxlength", "maxlength", numberAttribute], tooltip: "tooltip", tooltipPosition: "tooltipPosition", tooltipPositionStyle: "tooltipPositionStyle", tooltipStyleClass: "tooltipStyleClass", focusOnHover: ["focusOnHover", "focusOnHover", booleanAttribute], selectOnFocus: ["selectOnFocus", "selectOnFocus", booleanAttribute], autoOptionFocus: ["autoOptionFocus", "autoOptionFocus", booleanAttribute], autofocusFilter: ["autofocusFilter", "autofocusFilter", booleanAttribute], disabled: "disabled", itemSize: "itemSize", autoZIndex: "autoZIndex", baseZIndex: "baseZIndex", showTransitionOptions: "showTransitionOptions", hideTransitionOptions: "hideTransitionOptions", filterValue: "filterValue", options: "options" }, outputs: { onChange: "onChange", onFilter: "onFilter", onFocus: "onFocus", onBlur: "onBlur", onClick: "onClick", onShow: "onShow", onHide: "onHide", onClear: "onClear", onLazyLoad: "onLazyLoad" }, host: { properties: { "class.p-inputwrapper-filled": "filled()", "class.p-inputwrapper-focus": "focused || overlayVisible" }, classAttribute: "p-element p-inputwrapper" }, providers: [DROPDOWN_VALUE_ACCESSOR], queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }, { propertyName: "filterViewChild", first: true, predicate: ["filter"], descendants: true }, { propertyName: "focusInputViewChild", first: true, predicate: ["focusInput"], descendants: true }, { propertyName: "editableInputViewChild", first: true, predicate: ["editableInput"], descendants: true }, { propertyName: "itemsViewChild", first: true, predicate: ["items"], descendants: true }, { propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }, { propertyName: "overlayViewChild", first: true, predicate: ["overlay"], descendants: true }, { propertyName: "firstHiddenFocusableElementOnOverlay", first: true, predicate: ["firstHiddenFocusableEl"], descendants: true }, { propertyName: "lastHiddenFocusableElementOnOverlay", first: true, predicate: ["lastHiddenFocusableEl"], descendants: true }], ngImport: i0, template: `
    {{ label() === 'p-emptylabel' ? ' ' : label() }} {{ label() === 'p-emptylabel' ? ' ' : label() }}
    • {{ getOptionGroupLabel(option.optionGroup) }}
    • {{ emptyFilterMessageLabel }}
    • {{ emptyMessageLabel }}
    `, isInline: true, styles: ["@layer primeng{.p-dropdown{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.p-dropdown-clear-icon{position:absolute;top:50%;margin-top:-.5rem}.p-dropdown-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-dropdown-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.p-dropdown-label-empty{overflow:hidden;opacity:0}input.p-dropdown-label{cursor:default}.p-dropdown .p-dropdown-panel{min-width:100%}.p-dropdown-items-wrapper{overflow:auto}.p-dropdown-item{cursor:pointer;font-weight:400;white-space:nowrap;position:relative;overflow:hidden}.p-dropdown-item-group{cursor:auto}.p-dropdown-items{margin:0;padding:0;list-style-type:none}.p-dropdown-filter{width:100%}.p-dropdown-filter-container{position:relative}.p-dropdown-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-fluid .p-dropdown{display:flex}.p-fluid .p-dropdown .p-dropdown-label{width:1%}.p-float-label .p-dropdown .p-placeholder{opacity:0}}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(() => i1.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(() => i1.NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(() => i4.Overlay), selector: "p-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "directive", type: i0.forwardRef(() => i3.PrimeTemplate), selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i5.Tooltip), selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i0.forwardRef(() => i6.Scroller), selector: "p-scroller", inputs: ["id", "style", "styleClass", "tabindex", "items", "itemSize", "scrollHeight", "scrollWidth", "orientation", "step", "delay", "resizeDelay", "appendOnly", "inline", "lazy", "disabled", "loaderDisabled", "columns", "showSpacer", "showLoader", "numToleratedItems", "loading", "autoSize", "trackBy", "options"], outputs: ["onLazyLoad", "onScroll", "onScrollIndexChange"] }, { kind: "directive", type: i0.forwardRef(() => i7.AutoFocus), selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "component", type: i0.forwardRef(() => TimesIcon), selector: "TimesIcon" }, { kind: "component", type: i0.forwardRef(() => ChevronDownIcon), selector: "ChevronDownIcon" }, { kind: "component", type: i0.forwardRef(() => SearchIcon), selector: "SearchIcon" }, { kind: "component", type: i0.forwardRef(() => DropdownItem), selector: "p-dropdownItem", inputs: ["id", "option", "selected", "focused", "label", "disabled", "visible", "itemSize", "ariaPosInset", "ariaSetSize", "template", "checkmark"], outputs: ["onClick", "onMouseEnter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: Dropdown, decorators: [{ type: Component, args: [{ selector: 'p-dropdown', template: `
    {{ label() === 'p-emptylabel' ? ' ' : label() }} {{ label() === 'p-emptylabel' ? ' ' : label() }}
    • {{ getOptionGroupLabel(option.optionGroup) }}
    • {{ emptyFilterMessageLabel }}
    • {{ emptyMessageLabel }}
    `, host: { class: 'p-element p-inputwrapper', '[class.p-inputwrapper-filled]': 'filled()', '[class.p-inputwrapper-focus]': 'focused || overlayVisible' }, providers: [DROPDOWN_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: ["@layer primeng{.p-dropdown{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.p-dropdown-clear-icon{position:absolute;top:50%;margin-top:-.5rem}.p-dropdown-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-dropdown-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.p-dropdown-label-empty{overflow:hidden;opacity:0}input.p-dropdown-label{cursor:default}.p-dropdown .p-dropdown-panel{min-width:100%}.p-dropdown-items-wrapper{overflow:auto}.p-dropdown-item{cursor:pointer;font-weight:400;white-space:nowrap;position:relative;overflow:hidden}.p-dropdown-item-group{cursor:auto}.p-dropdown-items{margin:0;padding:0;list-style-type:none}.p-dropdown-filter{width:100%}.p-dropdown-filter-container{position:relative}.p-dropdown-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-fluid .p-dropdown{display:flex}.p-fluid .p-dropdown .p-dropdown-label{width:1%}.p-float-label .p-dropdown .p-placeholder{opacity:0}}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.FilterService }, { type: i3.PrimeNGConfig }], propDecorators: { id: [{ type: Input }], scrollHeight: [{ type: Input }], filter: [{ type: Input, args: [{ transform: booleanAttribute }] }], name: [{ type: Input }], style: [{ type: Input }], panelStyle: [{ type: Input }], styleClass: [{ type: Input }], panelStyleClass: [{ type: Input }], readonly: [{ type: Input, args: [{ transform: booleanAttribute }] }], required: [{ type: Input, args: [{ transform: booleanAttribute }] }], editable: [{ type: Input, args: [{ transform: booleanAttribute }] }], appendTo: [{ type: Input }], tabindex: [{ type: Input, args: [{ transform: numberAttribute }] }], placeholder: [{ type: Input }], loadingIcon: [{ type: Input }], filterPlaceholder: [{ type: Input }], filterLocale: [{ type: Input }], variant: [{ type: Input }], inputId: [{ type: Input }], dataKey: [{ type: Input }], filterBy: [{ type: Input }], filterFields: [{ type: Input }], autofocus: [{ type: Input, args: [{ transform: booleanAttribute }] }], resetFilterOnHide: [{ type: Input, args: [{ transform: booleanAttribute }] }], checkmark: [{ type: Input, args: [{ transform: booleanAttribute }] }], dropdownIcon: [{ type: Input }], loading: [{ type: Input, args: [{ transform: booleanAttribute }] }], optionLabel: [{ type: Input }], optionValue: [{ type: Input }], optionDisabled: [{ type: Input }], optionGroupLabel: [{ type: Input }], optionGroupChildren: [{ type: Input }], autoDisplayFirst: [{ type: Input, args: [{ transform: booleanAttribute }] }], group: [{ type: Input, args: [{ transform: booleanAttribute }] }], showClear: [{ type: Input, args: [{ transform: booleanAttribute }] }], emptyFilterMessage: [{ type: Input }], emptyMessage: [{ type: Input }], lazy: [{ type: Input, args: [{ transform: booleanAttribute }] }], virtualScroll: [{ type: Input, args: [{ transform: booleanAttribute }] }], virtualScrollItemSize: [{ type: Input, args: [{ transform: numberAttribute }] }], virtualScrollOptions: [{ type: Input }], overlayOptions: [{ type: Input }], ariaFilterLabel: [{ type: Input }], ariaLabel: [{ type: Input }], ariaLabelledBy: [{ type: Input }], filterMatchMode: [{ type: Input }], maxlength: [{ type: Input, args: [{ transform: numberAttribute }] }], tooltip: [{ type: Input }], tooltipPosition: [{ type: Input }], tooltipPositionStyle: [{ type: Input }], tooltipStyleClass: [{ type: Input }], focusOnHover: [{ type: Input, args: [{ transform: booleanAttribute }] }], selectOnFocus: [{ type: Input, args: [{ transform: booleanAttribute }] }], autoOptionFocus: [{ type: Input, args: [{ transform: booleanAttribute }] }], autofocusFilter: [{ type: Input, args: [{ transform: booleanAttribute }] }], disabled: [{ type: Input }], itemSize: [{ type: Input }], autoZIndex: [{ type: Input }], baseZIndex: [{ type: Input }], showTransitionOptions: [{ type: Input }], hideTransitionOptions: [{ type: Input }], filterValue: [{ type: Input }], options: [{ type: Input }], onChange: [{ type: Output }], onFilter: [{ type: Output }], onFocus: [{ type: Output }], onBlur: [{ type: Output }], onClick: [{ type: Output }], onShow: [{ type: Output }], onHide: [{ type: Output }], onClear: [{ type: Output }], onLazyLoad: [{ type: Output }], containerViewChild: [{ type: ViewChild, args: ['container'] }], filterViewChild: [{ type: ViewChild, args: ['filter'] }], focusInputViewChild: [{ type: ViewChild, args: ['focusInput'] }], editableInputViewChild: [{ type: ViewChild, args: ['editableInput'] }], itemsViewChild: [{ type: ViewChild, args: ['items'] }], scroller: [{ type: ViewChild, args: ['scroller'] }], overlayViewChild: [{ type: ViewChild, args: ['overlay'] }], firstHiddenFocusableElementOnOverlay: [{ type: ViewChild, args: ['firstHiddenFocusableEl'] }], lastHiddenFocusableElementOnOverlay: [{ type: ViewChild, args: ['lastHiddenFocusableEl'] }], templates: [{ type: ContentChildren, args: [PrimeTemplate] }] } }); class DropdownModule { static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: DropdownModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.7", ngImport: i0, type: DropdownModule, declarations: [Dropdown, DropdownItem], imports: [CommonModule, OverlayModule, SharedModule, TooltipModule, RippleModule, ScrollerModule, AutoFocusModule, TimesIcon, ChevronDownIcon, SearchIcon, BlankIcon, CheckIcon], exports: [Dropdown, OverlayModule, SharedModule, ScrollerModule] }); static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: DropdownModule, imports: [CommonModule, OverlayModule, SharedModule, TooltipModule, RippleModule, ScrollerModule, AutoFocusModule, TimesIcon, ChevronDownIcon, SearchIcon, BlankIcon, CheckIcon, OverlayModule, SharedModule, ScrollerModule] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: DropdownModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule, OverlayModule, SharedModule, TooltipModule, RippleModule, ScrollerModule, AutoFocusModule, TimesIcon, ChevronDownIcon, SearchIcon, BlankIcon, CheckIcon], exports: [Dropdown, OverlayModule, SharedModule, ScrollerModule], declarations: [Dropdown, DropdownItem] }] }] }); /** * Generated bundle index. Do not edit. */ export { DROPDOWN_VALUE_ACCESSOR, Dropdown, DropdownItem, DropdownModule }; //# sourceMappingURL=primeng-dropdown.mjs.map