dap-design-system 0.62.2 → 0.62.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/common/utils.d.ts +8 -0
  2. package/dist/common/utils.js +36 -31
  3. package/dist/common/utils.js.map +1 -1
  4. package/dist/components/combobox/comboboxBase.d.ts +8 -0
  5. package/dist/components/combobox/comboboxBase.js +64 -33
  6. package/dist/components/combobox/comboboxBase.js.map +1 -1
  7. package/dist/components/option-list/option-list.component.d.ts +2 -0
  8. package/dist/components/option-list/option-list.component.js +42 -39
  9. package/dist/components/option-list/option-list.component.js.map +1 -1
  10. package/dist/components/popup/popup-base-element.d.ts +6 -0
  11. package/dist/components/popup/popup-base-element.js +92 -63
  12. package/dist/components/popup/popup-base-element.js.map +1 -1
  13. package/dist/components/select/select.component.js +33 -30
  14. package/dist/components/select/select.component.js.map +1 -1
  15. package/dist/components/table/table-header.component.d.ts +5 -1
  16. package/dist/components/table/table-header.component.js +24 -18
  17. package/dist/components/table/table-header.component.js.map +1 -1
  18. package/dist/components/table/table.component.d.ts +3 -3
  19. package/dist/components/table/table.component.js +31 -29
  20. package/dist/components/table/table.component.js.map +1 -1
  21. package/dist/localization/locales/de.json.js +7 -7
  22. package/dist/localization/locales/en.json.js +6 -6
  23. package/dist/localization/locales/hu.json.js +1 -1
  24. package/dist/manifest/types/vue/index.d.ts +281 -278
  25. package/dist/manifest/vscode.html-custom-data.json +262 -252
  26. package/dist/manifest/web-types.json +375 -355
  27. package/dist/react/index.d.ts +9 -9
  28. package/dist/react-types.ts +10 -10
  29. package/dist/react.js +124 -124
  30. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"comboboxBase.js","sources":["../../../src/components/combobox/comboboxBase.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { html } from 'lit/static-html.js'\n\nimport { PopupPlacement } from '@/common/types'\nimport { getValidityStateObject } from '@/common/utils'\nimport { GenericFormElement } from '@/internal/mixin/genericFormElement'\nimport { t } from '@/localization/localization'\n\nimport DapDSOptionList from '../option-list/option-list.component'\nimport styles from './combobox.scss?inline'\n\nexport default class ComboboxBaseElement extends GenericFormElement {\n @query('input') readonly triggerInput: HTMLInputElement\n @query('dap-ds-option-list') readonly optionList: DapDSOptionList\n @property({ reflect: true }) placement: PopupPlacement = 'bottom-start'\n @property({ type: Boolean, reflect: true }) opened = false\n @property() searchMode: 'none' | 'typehead' | 'autocomplete' | 'manual' =\n 'autocomplete'\n @property({ type: Boolean }) search = false\n @property() clearButton?: string = 'true'\n @property() placeholder: string | null\n @property({ type: Boolean }) sync?: boolean\n @property({ type: Boolean }) allowManualInput?: boolean = false\n @property({ type: Boolean }) searchForText?: boolean = false\n @property({ type: String }) searchOnValueSet? = 'false'\n @property({ type: Boolean }) loading?: boolean = false\n @property({ type: String }) selectable?: string = 'true'\n @property({ type: Boolean }) noAnimation?: boolean = false\n @property({ type: Boolean }) textComplete?: boolean = false\n @property({ type: Boolean }) openOnEmpty?: boolean = false\n @property({ type: Boolean }) disableViewportAutoClose: boolean = false\n @property() searchButtonAriaLabel?: string\n @property({ type: Boolean }) subtle: boolean\n @property({ type: Boolean, reflect: true }) multiselect: boolean = false\n @property({ type: Number, reflect: true }) maxSelections?: number\n\n /** `data-testid` for the clear button. */\n @property() clearButtonTestId = 'combobox-clear-button'\n\n /** `data-testid` for the search button. */\n @property() searchButtonTestId = 'combobox-search-button'\n\n /**\n * When enabled, the search button (the trailing icon button in search mode) is\n * automatically disabled while the input is empty and re-enabled as soon as the\n * user types. Opt-in; does not affect the input itself, which stays editable.\n */\n @property({ type: Boolean }) disableSearchWhenEmpty = false\n\n /** True when the search input currently holds non-whitespace text. */\n private get hasSearchText(): boolean {\n const text = this.selectedText || this.selectedItemText || this.value || ''\n return text.trim().length > 0\n }\n\n @state() selectedItem: any\n\n /**\n * Display text of the selected item. `selectedItem` is either an option element\n * (has `optionText`) when set from `value`, or an option event detail (has `text`)\n * when picked by the user; reading `.text` alone yields \"undefined\" for the former.\n */\n private get selectedItemText(): string {\n return this.selectedItem?.text ?? this.selectedItem?.optionText ?? ''\n }\n @state() selectedItems: any[] = []\n @state() currentItem: any\n @state() selectedText: string\n\n private optionListObserver: MutationObserver | null = null\n private isUserInteraction: boolean = false\n private pendingInitialValues: string[] = []\n\n static readonly styles = unsafeCSS(styles)\n\n protected async firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): Promise<void> {\n super.firstUpdated(_changedProperties)\n\n await this.optionList.updateComplete\n\n // Wait for next frame to ensure slotted options are available\n await new Promise(resolve => requestAnimationFrame(resolve))\n\n // Wait for all option items to complete their updates\n const options = this.getComboboxOptions()\n\n await Promise.all(options.map((opt: any) => opt.updateComplete))\n\n // Get the underlying value, not the computed value from the getter\n const underlyingValue = super.value\n\n if (underlyingValue) {\n if (this.multiselect) {\n // Handle multiselect mode - parse comma-separated values\n const values = underlyingValue\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v)\n // Store initial values to process later when options are ready\n this.pendingInitialValues = values\n // Try to populate immediately if options are available\n this.updateMultipleSelectionsFromValues(values)\n } else {\n // Handle single-select mode\n // Try to find the selected item from available options\n this.selectedItem = this.optionList\n ?.getAllOptions()\n .find(option => option.value === underlyingValue)\n\n if (this.selectedItem) {\n this.selectedText = this.selectedItem.optionText || ''\n } else {\n // If no selected item found, leave selectedText empty\n // It will be updated when options are loaded via updateSelectionFromValue\n this.selectedText = ''\n }\n\n if (\n !this.selectedText &&\n (this.allowManualInput || this.searchMode === 'none')\n ) {\n this.selectedText = underlyingValue\n }\n }\n }\n\n // Set up MutationObserver to watch for dynamic option changes\n this.setupOptionListObserver()\n }\n\n protected updated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(_changedProperties)\n\n // Handle value property changes from outside the component\n // Only process for combobox components, not search components\n // Skip multiselect mode as the setter already handles value updates\n if (\n _changedProperties.has('value') &&\n this.triggerInput &&\n !this.search &&\n !this.multiselect\n ) {\n const newValue = this.value\n if (newValue) {\n this.handleValueChange(newValue)\n } else {\n this.clearSelection()\n }\n }\n\n // Free-text search (searchMode 'none' or allowManualInput) has no option to\n // map onto, so the branch above skips it and the value never reaches the\n // uncontrolled input. Reflect an externally-set value straight into the field\n // so the search box is controllable (e.g. restoring a saved query). Typehead/\n // autocomplete search keeps its existing behaviour. The guard leaves the\n // input untouched when it already matches, so a keystroke — which set the\n // value in the first place — doesn't bounce the caret to the end.\n if (\n _changedProperties.has('value') &&\n this.triggerInput &&\n this.isFreeTextSearch\n ) {\n const newValue = this.value ?? ''\n if (this.triggerInput.value !== newValue) {\n this.triggerInput.value = newValue\n }\n this.selectedText = newValue\n }\n }\n\n private get isFreeTextSearch(): boolean {\n return (\n Boolean(this.search) &&\n (this.searchMode === 'none' || Boolean(this.allowManualInput))\n )\n }\n\n /**\n * Handles value changes from outside the component\n * This ensures the selection state is updated when the value is set programmatically\n */\n private handleValueChange(newValue: string): void {\n if (!newValue) return\n\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n // Try to find the option with the new value\n const option = this.getComboboxOptions().find(opt => opt.value === newValue)\n\n if (option) {\n // Option found, update selection\n this.selectedItem = option\n this.selectedText = option.optionText || option.textContent || ''\n\n // Update the input value\n if (this.triggerInput) {\n this.triggerInput.value = this.selectedText\n }\n\n // Trigger re-render\n this.requestUpdate()\n } else {\n // Option not found yet (might be loading)\n this.selectedItem = null\n\n // For search components, preserve the selectedText to maintain search functionality\n // For combobox components, clear it to avoid showing raw values\n if (!this.search) {\n this.selectedText = ''\n\n // Clear input value\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n }\n\n private setupOptionListObserver(): void {\n if (!this.optionList) return\n\n // Disconnect existing observer if any\n if (this.optionListObserver) {\n this.optionListObserver.disconnect()\n }\n\n // Create new observer to watch for changes in the option list\n this.optionListObserver = new MutationObserver(mutations => {\n let shouldUpdateState = false\n\n mutations.forEach(mutation => {\n if (mutation.type === 'childList') {\n // Check if option items were added or removed\n const addedOptions = Array.from(mutation.addedNodes).some(\n node => node.nodeName === 'DAP-DS-OPTION-ITEM',\n )\n const removedOptions = Array.from(mutation.removedNodes).some(\n node => node.nodeName === 'DAP-DS-OPTION-ITEM',\n )\n\n if (addedOptions || removedOptions) {\n shouldUpdateState = true\n }\n }\n })\n\n if (shouldUpdateState) {\n // Update combobox state based on new option list\n this.updateComboboxState()\n }\n })\n\n // Start observing the combobox element itself for slot changes\n // This is needed because remote data is added directly to the combobox element\n this.optionListObserver.observe(this, {\n childList: true,\n subtree: true,\n })\n }\n\n private updateComboboxState(): void {\n // Wait for the next tick to ensure DOM is updated\n requestAnimationFrame(() => {\n // Wait one more tick to ensure options are fully initialized\n requestAnimationFrame(() => {\n const hasOptions = this.getComboboxOptions().length > 0\n const hasInputValue =\n this.triggerInput?.value && this.triggerInput.value.trim() !== ''\n\n // If we have options and the dropdown should be open, show it\n // For search components (this.search = true) or autocomplete mode\n // Only open if this is a user interaction, not programmatic value setting\n if (\n hasOptions &&\n hasInputValue &&\n (this.isAutoComplete || this.search) &&\n this.isUserInteraction\n ) {\n if (!this.opened) {\n this.showDropDown()\n }\n } else if (!hasOptions && !this.openOnEmpty && hasInputValue) {\n // If no options and we don't allow empty, hide the dropdown\n // But only if the user has actually typed something\n this.hideDropDown()\n }\n\n // Handle value restoration when options become available\n if (hasOptions) {\n if (this.multiselect) {\n // For multiselect, check if selectedItems needs to be populated\n if (\n this.selectedItems.length === 0 &&\n this.pendingInitialValues.length > 0\n ) {\n this.updateMultipleSelectionsFromValues(this.pendingInitialValues)\n }\n } else {\n // For single-select, check if selectedItem needs to be populated\n if (this.value && !this.selectedItem) {\n this.updateSelectionFromValue()\n }\n }\n }\n })\n })\n }\n\n /**\n * Updates the selection state based on the current value\n * This is useful when options are loaded asynchronously\n */\n private updateSelectionFromValue(): void {\n if (!this.value) return\n\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n const option = this.getComboboxOptions().find(\n opt => opt.value === this.value,\n )\n\n if (option) {\n this.selectedItem = option\n this.selectedText = option.optionText || option.textContent || ''\n\n // Update the input value to show the selected text\n if (this.triggerInput) {\n this.triggerInput.value = this.selectedText\n }\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n }\n }\n\n private cleanupOptionListObserver(): void {\n if (this.optionListObserver) {\n this.optionListObserver.disconnect()\n this.optionListObserver = null\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n this.cleanupOptionListObserver()\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null,\n ): void {\n if (name === 'value' && !value) {\n this.clearSelection()\n }\n\n super.attributeChangedCallback(name, _old, value)\n }\n\n get isAutoComplete() {\n return this.searchMode === 'autocomplete' || this.searchMode === 'manual'\n }\n\n /**\n * Get all option items directly from the combobox element\n * This is more reliable for dynamic updates than the option list component\n */\n private getComboboxOptions(): any[] {\n return Array.from(this.querySelectorAll('dap-ds-option-item'))\n }\n\n get isOpenOnEmpty() {\n return (\n this.openOnEmpty ||\n (!this.openOnEmpty && this.getComboboxOptions().length > 0)\n )\n }\n\n get isOpenOnAutocomplete() {\n return this.isAutoComplete && this.isOpenOnEmpty\n }\n\n get shouldHideClearIcon() {\n // Check if input is empty (cross-browser compatible)\n const inputValue = this.triggerInput?.value || ''\n const hasPlaceholder = this.placeholder && this.placeholder.trim() !== ''\n\n // Only apply JavaScript fallback when there's no placeholder\n // When there IS a placeholder, let CSS :placeholder-shown handle it\n if (hasPlaceholder) {\n return false // Let CSS handle it\n }\n\n // Hide clear icon when input is empty and has no placeholder\n return inputValue === ''\n }\n\n handleClick = () => {\n if (!this.getComboboxOptions().length && !this.openOnEmpty) {\n this.hideDropDown()\n } else {\n this.opened ? this.hideDropDown() : this.showDropDown()\n }\n }\n\n private async handleEnterKey(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n\n if (this.allowManualInput) {\n return this.handleSearchEnter()\n }\n\n if (this.currentItem && this.opened) {\n return this.handleCurrentItemEnter()\n }\n\n if (this.search && !this.isAutoComplete) {\n return this.handleSearchEnter()\n }\n\n return this.handleDefaultEnter()\n }\n\n private async handleCurrentItemEnter() {\n if (this.currentItem.value === this.selectedItem?.value) {\n this.hideDropDown()\n this.triggerInput.value = this.selectedItemText\n this.triggerInput.focus()\n return\n }\n\n if (this.currentItem.value !== this.selectedItem?.value) {\n if (!this.searchForText) {\n await this.handleSelectedItemChange(this.currentItem)\n } else {\n await this.handleTextSearch(this.currentItem.text)\n }\n }\n }\n\n private async handleSearchEnter() {\n this.emit('dds-search', { search: this.selectedText })\n this.setValidity()\n return this.hideDropDown()\n }\n\n private async handleDefaultEnter() {\n if (this.opened) {\n return this.hideDropDown()\n } else {\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n return (\n (this.openOnEmpty ||\n this.getComboboxOptions().length ||\n this.isAutoComplete) &&\n this.showDropDown()\n )\n }\n }\n\n private async handleSelectedItemChange(item: any) {\n this.selectedItem = item\n this.emit('dds-change', {\n value: this.selectedItem.value,\n selectedItem: this.selectedItem,\n type: 'select',\n })\n await this.updateComplete\n this.value = this.selectedItem.value\n this.selectedText = this.currentItem.text\n this.triggerInput.value = this.currentItem.text\n this.triggerInput.focus()\n this.setValidity()\n }\n\n private async handleTextSearch(text: string) {\n this.value = text\n this.selectedText = text\n this.triggerInput.value = text\n this.triggerInput.focus()\n this.emit('dds-search', { search: text })\n this.setValidity()\n }\n\n private async handleArrowKeys(event: KeyboardEvent) {\n event.preventDefault()\n\n if (!this.opened) {\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n if (\n this.openOnEmpty ||\n this.getComboboxOptions().length ||\n this.isAutoComplete\n ) {\n this.showDropDown()\n } else {\n return // Don't proceed if we can't open dropdown\n }\n }\n\n await this.updateComplete\n this.optionList.captureFocus(event.key)\n }\n\n handleKeyDown = async (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n // Close the list so its options leave the tab order; Tab then moves on natively\n this.hideDropDown({ skipFocus: true })\n return\n }\n\n if (event.key === 'Enter') {\n return this.handleEnterKey(event)\n }\n\n if (event.key === 'Escape') {\n this.hideDropDown()\n return this.focus()\n }\n\n // Handle Backspace for chip removal in multiselect mode\n if (event.key === 'Backspace' && this.multiselect) {\n const inputValue = this.triggerInput?.value || ''\n // Only remove chip if input is empty\n if (inputValue === '' && this.selectedItems.length > 0) {\n event.preventDefault()\n const lastItem = this.selectedItems[this.selectedItems.length - 1]\n this.removeSelectedItem(lastItem)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'remove',\n item: lastItem,\n })\n this.setValidity()\n return\n }\n }\n\n if (\n (event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight') &&\n this.isAutoComplete\n ) {\n return this.handleArrowKeys(event)\n }\n\n // For autocomplete mode, only show dropdown if there are options OR if openOnEmpty is true\n if (this.isAutoComplete && this.triggerInput?.value && !this.opened) {\n const hasOptions = this.getComboboxOptions().length > 0\n if (this.openOnEmpty || hasOptions) {\n this.showDropDown()\n }\n }\n }\n\n handleInput = async (event: InputEvent) => {\n const input = this.triggerInput\n\n // Mark this as user interaction\n this.isUserInteraction = true\n if (\n event.inputType !== 'deleteContentBackward' ||\n (event.inputType === 'deleteContentBackward' && this.allowManualInput)\n ) {\n this.selectedText = input.value\n if (this.search) {\n this.value = input.value\n }\n } else if (this.search) {\n this.selectedText = input.value\n this.value = input.value\n } else if (\n input.value === '' &&\n event.inputType === 'deleteContentBackward'\n ) {\n this.clearSelection()\n }\n\n this.emit('dds-input', { input: input.value, originalEvent: event })\n this.setValidity()\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n // For autocomplete mode, only show dropdown if there are options OR if openOnEmpty is true\n if (this.isAutoComplete && input.value && !this.opened) {\n const hasOptions = this.getComboboxOptions().length > 0\n if (this.openOnEmpty || hasOptions) {\n this.showDropDown()\n }\n }\n }\n\n async clearSelection() {\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n // Was there anything to clear? Clearing an already-empty control (e.g. a\n // programmatic `value = ''` on mount) must stay silent — otherwise it fires\n // dds-change as if the user cleared a value, which a consumer reads as an\n // edit. A real clear (the × button on a filled field) still emits.\n const hadValue = Boolean(\n this.value || this.selectedText || this.triggerInput?.value,\n )\n\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n this.selectedText = ''\n this.selectedItem = null\n\n this.value = undefined\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n await this.updateComplete\n\n if (hadValue) {\n this.emit('dds-change', this.selectedItem)\n }\n }\n\n /**\n * Multiselect helper methods\n */\n private getSelectedValues(): string[] {\n return this.selectedItems.map(item => item.value)\n }\n\n private isMaxSelectionsReached(): boolean {\n if (!this.maxSelections) return false\n return this.selectedItems.length >= this.maxSelections\n }\n\n private addSelectedItem(item: any): void {\n if (!this.multiselect) return\n\n // Check if item is already selected\n const isAlreadySelected = this.selectedItems.some(\n selected => selected.value === item.value,\n )\n\n if (isAlreadySelected) return\n\n // Check max selections limit\n if (this.isMaxSelectionsReached()) return\n\n // Add item to selectedItems array\n this.selectedItems = [...this.selectedItems, item]\n\n // Update value to comma-separated string (use super to avoid setter loop)\n const newValue = this.getSelectedValues().join(',')\n super.value = newValue\n\n // Clear input text\n this.selectedText = ''\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private removeSelectedItem(item: any): void {\n if (!this.multiselect) return\n\n // Remove item from selectedItems array\n this.selectedItems = this.selectedItems.filter(\n selected => selected.value !== item.value,\n )\n\n // Update value to comma-separated string (use super to avoid setter loop)\n if (this.selectedItems.length === 0) {\n super.value = undefined\n } else {\n const newValue = this.getSelectedValues().join(',')\n super.value = newValue\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private clearAllSelections(): void {\n if (!this.multiselect) return\n\n // Clear all selections\n this.selectedItems = []\n super.value = undefined\n this.selectedText = ''\n\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private updateMultipleSelectionsFromValues(values: string[]): void {\n if (!this.multiselect) return\n\n const options = this.getComboboxOptions()\n\n // Don't clear if we've already populated items\n const shouldClear = this.selectedItems.length === 0\n if (shouldClear) {\n this.selectedItems = []\n }\n\n let foundAny = false\n values.forEach(value => {\n // Check both property and attribute since elements might not be fully upgraded\n const option = options.find(\n opt => opt.value === value || opt.getAttribute('value') === value,\n )\n if (option) {\n // Check if already in selectedItems to avoid duplicates\n const exists = this.selectedItems.some(item => item.value === value)\n if (!exists) {\n this.selectedItems.push(option)\n foundAny = true\n }\n }\n })\n\n // Clear pending values if we successfully found items\n if (foundAny && this.pendingInitialValues.length > 0) {\n this.pendingInitialValues = []\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n /**\n * Override value getter/setter to handle multiselect mode\n */\n override get value(): string | undefined {\n if (this.multiselect) {\n const values = this.getSelectedValues()\n const result = values.length > 0 ? values.join(',') : undefined\n return result\n }\n return super.value\n }\n\n override set value(val: string | undefined) {\n if (this.multiselect) {\n // Parse comma-separated values\n const values = val\n ? val\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v)\n : []\n\n // Store as pending if we have values and selectedItems is empty\n // This ensures initial values are processed even if set after component is created\n if (values.length > 0 && this.selectedItems.length === 0) {\n this.pendingInitialValues = values\n }\n\n this.updateMultipleSelectionsFromValues(values)\n\n // Update parent value\n super.value = val\n } else {\n // Single select mode - use parent implementation\n super.value = val\n }\n }\n\n handleListKeyDown = (event: CustomEvent) => {\n if (event.detail?.key === 'Tab') {\n // Move focus back to the input synchronously so the native Tab continues\n // from there and leaves the combobox instead of cycling inside the list.\n this.hideDropDown({ skipFocus: true })\n this.triggerInput.focus()\n return\n }\n\n if (event.detail?.key === 'Escape') {\n this.hideDropDown()\n this.currentItem = this.selectedItem\n this.selectedText = ''\n // Nothing selected yet (user only typed): keep the typed text\n if (this.selectedItem) {\n this.triggerInput.value = this.selectedItemText\n }\n this.triggerInput.focus()\n }\n }\n\n handleDocumentMouseDown = (event: MouseEvent) => {\n const path = event.composedPath()\n if (this && !path.includes(this)) {\n this.hideDropDown()\n }\n }\n\n private readonly handlePopupAutoClose = () => {\n this.hideDropDown({ skipFocus: true })\n }\n\n handleFocus = () => {\n this.emit('dds-focus')\n }\n\n handleBlur = () => {\n this.emit('dds-blur')\n }\n\n async showDropDown() {\n if (this.disabled || this.readonly || !this.isAutoComplete || this.opened) {\n return\n }\n\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n if (\n !this.openOnEmpty &&\n !this.getComboboxOptions().length &&\n !this.isAutoComplete\n ) {\n return\n }\n\n this.opened = true\n\n document.addEventListener('mousedown', this.handleDocumentMouseDown)\n }\n\n async hideDropDown(options?: { skipFocus?: boolean }) {\n if (!this.opened) {\n return\n }\n\n this.opened = false\n\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n\n await this.updateComplete\n if (!options?.skipFocus) {\n this.focus()\n }\n this.clearSelectionRange()\n }\n\n public get focusElement() {\n return this.triggerInput\n }\n\n handleSelectedChange = async (event: CustomEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (this.searchForText) {\n this.selectedText = event.detail.text\n this.value = event.detail.text\n this.triggerInput.value = event.detail.text\n\n this.emit('dds-search', { search: this.selectedText })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n this.setValidity()\n } else if (this.multiselect) {\n // Multiselect mode - add item to selected items\n this.addSelectedItem(event.detail)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'add',\n item: event.detail,\n })\n\n // Clear current item to prevent text completion from filling it back in\n this.currentItem = null\n\n // Wait for update to complete before focusing\n await this.updateComplete\n\n // Ensure input is cleared after render\n this.triggerInput.value = ''\n this.triggerInput.focus()\n this.setValidity()\n\n // Don't close dropdown in multiselect mode\n return\n } else {\n this.selectedItem = event.detail\n this.selectedText = event.detail.text\n\n if (this.value !== this.selectedItem?.value) {\n this.triggerInput.value = event.detail.text\n this.value = this.selectedItem.value\n this.emit('dds-change', {\n value: this.selectedItem.value,\n selectedItem: this.selectedItem,\n type: 'select',\n })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n await this.updateComplete\n\n if (this.currentItem) {\n this.triggerInput.value = this.currentItem.text\n }\n this.triggerInput.focus()\n this.setValidity()\n }\n }\n\n this.hideDropDown()\n }\n\n handleOptionDeselect = (event: CustomEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n this.selectedItem = null\n this.selectedText = ''\n this.value = undefined\n this.triggerInput.value = ''\n this.emit('dds-change', {\n value: undefined,\n selectedItem: null,\n type: 'deselect',\n })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n this.setValidity()\n }\n\n handleCurrentOptionChange = (event: CustomEvent) => {\n this.currentItem = event.detail\n\n // Skip text completion in multiselect mode\n if (this.multiselect) {\n return\n }\n\n if (event.detail) {\n if (\n this.textComplete &&\n this.searchMode !== 'manual' &&\n this.searchMode !== 'none'\n ) {\n this.triggerInput.value = event.detail.text\n }\n\n if (\n this.isAutoComplete &&\n this.selectedText &&\n this.selectedText !== '' &&\n !this.allowManualInput &&\n this.textComplete\n ) {\n this.triggerInput.value = event.detail.text\n this.setSelectionRange(\n this.selectedText.length,\n this.triggerInput.value.length,\n )\n }\n }\n }\n\n handleListChanged = (event: CustomEvent) => {\n if (!event.detail.elements.length && !this.openOnEmpty) {\n this.hideDropDown()\n }\n }\n\n handleClearClick = () => {\n if (!this.disabled) {\n if (this.multiselect) {\n this.clearAllSelections()\n } else {\n this.clearSelection()\n }\n\n this.triggerInput.focus()\n this.setValidity()\n\n if (!this.openOnEmpty) {\n this.hideDropDown()\n }\n\n this.emit('dds-clear')\n }\n }\n\n handleSearchClick = (event: MouseEvent) => {\n event.stopPropagation()\n event.preventDefault()\n\n this.setValidity()\n this.emit('dds-search', { search: this.selectedText })\n }\n\n private setSelectionRange(start: number, end: number) {\n this.triggerInput.setSelectionRange(start, end)\n }\n\n private clearSelectionRange() {\n const controlValueLength = this.triggerInput.value.length\n\n this.setSelectionRange(controlValueLength, controlValueLength)\n }\n\n getValidity() {\n if (this.multiselect) {\n return this.getMultiSelectValidity()\n }\n if (this.isAutoComplete) {\n return this.getAutoCompleteValidity()\n }\n return this.getBasicValidity()\n }\n\n formResetCallback() {\n this.internals.setValidity({})\n this.internals.setFormValue(this.defaultValue)\n this.value = this.defaultValue\n if (this.multiselect) {\n this.selectedItems = []\n } else {\n // Resolve to the option element; a bare value string has no value/text fields\n this.selectedItem =\n this.getComboboxOptions().find(\n option => option.value === this.defaultValue,\n ) ?? null\n }\n }\n\n private getMultiSelectValidity(): boolean {\n // Valid if not required OR has at least one selection\n return !this.required || this.selectedItems.length > 0\n }\n\n private getAutoCompleteValidity(): boolean {\n if (this.allowManualInput) {\n return this.getManualInputValidity()\n }\n if (this.searchForText) {\n return this.getSearchTextValidity()\n }\n return this.getSelectedItemValidity()\n }\n\n private getManualInputValidity(): boolean {\n return (\n this.triggerInput.value !== '' ||\n (this.selectedItem !== null && this.selectedItem !== undefined)\n )\n }\n\n private getSearchTextValidity(): boolean {\n return this.triggerInput.value !== ''\n }\n\n private getSelectedItemValidity(): boolean {\n return !!this.selectedItem\n }\n\n private getBasicValidity(): boolean {\n return this.triggerInput.value !== ''\n }\n\n // custom validation\n get validity(): ValidityState {\n if (this.internals.validity) {\n return this.internals.validity\n } else {\n return getValidityStateObject({\n valueMissing: this.required && !this.getValidity(),\n })\n }\n }\n\n get validationMessage(): string {\n return t('form.validationMessage.select')\n }\n\n checkValidity() {\n return this.required ? this.getValidity() : true\n }\n\n reportValidity() {\n return this.required ? this.checkValidity() : true\n }\n\n setValidity() {\n if (!this.checkValidity()) {\n this.internals.setValidity(\n {\n valueMissing: this.required && !this.getValidity(),\n },\n this.validationMessage,\n this.triggerInput,\n )\n } else {\n this.internals.setValidity({})\n }\n }\n\n handleInvalid(event: Event) {\n event.preventDefault()\n }\n\n getActiveDescendant() {\n if (!this.opened) {\n return this.triggerInput\n }\n\n const activeOption = this.optionList?.getActiveOption()\n return activeOption\n }\n\n getSearchIconSize(size: string) {\n switch (size) {\n case 'sm':\n return 'md'\n case 'lg':\n return 'lg'\n case 'xs':\n return 'sm'\n default:\n return 'md'\n }\n }\n\n getInnerIconSize(size: string) {\n switch (size) {\n case 'sm':\n return 16\n case 'lg':\n return 16\n case 'xs':\n return 10\n default:\n return 16\n }\n }\n\n private handleChipRemove = (event: CustomEvent, item: any) => {\n event.stopPropagation()\n this.removeSelectedItem(item)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'remove',\n item: item,\n })\n this.setValidity()\n\n // Focus input after removal\n this.triggerInput.focus()\n }\n\n private renderChip(item: any) {\n // Get text from the option element - prefer optionText getter, then textContent\n const text = item.optionText || item.textContent || item.text || ''\n\n return html`\n <dap-ds-chip\n size=\"sm\"\n removeable\n .value=${item.value}\n @dds-remove=${(e: CustomEvent) => this.handleChipRemove(e, item)}>\n ${text}\n </dap-ds-chip>\n `\n }\n\n private renderChips() {\n if (!this.multiselect || this.selectedItems.length === 0) {\n return nothing\n }\n\n return html`\n <div class=\"combobox__chips\" part=\"chips\">\n ${this.selectedItems.map(item => this.renderChip(item))}\n </div>\n `\n }\n\n private renderInput() {\n // In multiselect mode, only show selectedText (typing), never show selectedItem\n const inputValue = this.multiselect\n ? this.selectedText\n : this.selectedText !== ''\n ? this.selectedText\n : this.selectedItemText\n\n return html`<input\n id=\"input\"\n part=\"input\"\n role=\"combobox\"\n class=\"${clsx('input', `input--${this.size}`, {\n 'input--disabled': this.disabled,\n 'input--readonly': this.readonly,\n 'input--multiselect': this.multiselect,\n })}\"\n aria-expanded=${this.opened}\n aria-haspopup=\"listbox\"\n aria-labelledby=\"label\"\n aria-describedby=\"description ${this.feedback ? 'feedback' : ''}\"\n aria-disabled=${this.disabled}\n aria-autocomplete=\"both\"\n aria-controls=\"option-list\"\n aria-activedescendant=${ifDefined(this.getActiveDescendant()?.id)}\n aria-multiselectable=${this.multiselect ? 'true' : 'false'}\n ?required=${this.required}\n ?readonly=${this.readonly}\n ?autofocus=${this.autofocus}\n autocomplete=${this.autocomplete as any}\n ?disabled=${this.disabled}\n value=${inputValue}\n placeholder=${ifDefined(this.placeholder ?? '')}\n type=${this.search ? 'search' : 'text'}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @click=${this.handleClick} />`\n }\n\n private renderClearButton() {\n if (this.clearButton !== 'true' || this.readonly) return nothing\n\n return html`<div\n class=\"${clsx('clear-icon', {\n 'clear-icon--hidden': this.shouldHideClearIcon,\n })}\">\n <dap-ds-icon-button\n icon=\"close-line\"\n data-testid=${this.clearButtonTestId}\n aria-label=${t('clear')}\n ?disabled=${this.disabled}\n @click=${this.handleClearClick}></dap-ds-icon-button>\n </div>`\n }\n\n private renderIndicatorIcon() {\n const isAutocompleteOrManual =\n this.searchMode === 'autocomplete' || this.searchMode === 'manual'\n const showLoadingSpinner = this.loading\n ? html`<dap-ds-icon-loading-spinner></dap-ds-icon-loading-spinner>`\n : null\n\n if (isAutocompleteOrManual && !this.search) {\n return html`<div\n class=\"${clsx('indicator-icon', {\n 'indicator-icon--loading': this.loading,\n })}\"\n part=\"indicator-icon\">\n ${showLoadingSpinner ||\n html`<slot name=\"indicator-icon\"\n ><dap-ds-icon-arrow-down-s-line\n aria-hidden=\"true\"\n @click=${this.handleClick}>\n </dap-ds-icon-arrow-down-s-line\n ></slot>`}\n </div>`\n }\n\n if (this.search) {\n return html`<div\n class=\"${clsx('indicator-icon', {\n 'indicator-icon--loading': this.loading,\n })}\">\n ${showLoadingSpinner ||\n html`<dap-ds-icon-button\n part=\"search-button\"\n size=${this.getSearchIconSize(this.size)}\n variant=${this.subtle ? 'neutral' : 'inverted-brand'}\n icon=\"search-line\"\n ?disabled=${this.disableSearchWhenEmpty && !this.hasSearchText}\n data-testid=${this.searchButtonTestId}\n iconSize=${this.getInnerIconSize(this.size)}\n aria-label=${this.searchButtonAriaLabel ?? t('search')}\n @click=${this.handleSearchClick}>\n </dap-ds-icon-button>`}\n </div>`\n }\n\n return nothing\n }\n\n private renderSelectActions() {\n return html`<div\n class=\"${clsx('select-action', `select-action--${this.size}`, {\n 'select-action--disabled': this.disabled,\n 'select-action--readonly': this.readonly,\n 'select-action--opened': this.opened,\n 'select-action--multiselect': this.multiselect,\n })}\">\n ${this.renderClearButton()} ${this.renderIndicatorIcon()}\n </div>`\n }\n\n private renderOptionList() {\n return html`<dap-ds-option-list\n class=\"option-list\"\n part=\"option-list\"\n id=\"option-list\"\n .search=${this.search}\n searchMode=${this.allowManualInput ? 'none' : this.searchMode}\n searchOnValueSet=${this.searchOnValueSet === 'true'}\n filterText=${this.selectedText}\n size=${ifDefined(this.size)}\n value=${ifDefined(this.value)}\n selectable=${ifDefined(this.selectable)}\n @dds-option-change=${this.handleSelectedChange}\n @dds-option-deselect=${this.handleOptionDeselect}\n @dds-keydown=${this.handleListKeyDown}\n @dds-current-change=${this.handleCurrentOptionChange}\n @dds-list-changed=${this.handleListChanged}>\n <slot></slot>\n </dap-ds-option-list>`\n }\n\n renderCombobox() {\n return html` ${(this, this.renderLabel())}\n <div>\n <dap-ds-popup\n part=\"base\"\n class=\"select-popup\"\n overflow\n ?opened=${this.opened}\n ?hasArrow=${false}\n placement=${this.placement}\n floatingStrategy=\"fixed\"\n offset=\"4\"\n ?sync=${this.sync}\n ?disableViewportAutoClose=${this.disableViewportAutoClose}\n @dds-close=${this.handlePopupAutoClose}\n @dds-closed=${this.hideDropDown}\n @dds-opened=${this.showDropDown}>\n <div\n slot=\"trigger\"\n part=\"trigger\"\n class=\"${clsx('select', `select--${this.size}`, {\n 'select--disabled': this.disabled,\n 'select--readonly': this.readonly,\n 'select--opened': this.opened,\n 'select--loading': this.loading,\n 'select--success': this.status === 'success',\n 'select--error': this.status === 'error',\n 'select--no-animation': this.noAnimation,\n 'select--multiselect': this.multiselect,\n })}\">\n ${this.renderChips()} ${this.renderInput()}\n ${this.renderSelectActions()}\n </div>\n ${this.renderOptionList()}\n </dap-ds-popup>\n ${this.multiselect\n ? html`<div\n class=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\">\n ${this.selectedItems.length > 0\n ? t('combobox.multiselect.selected', {\n count: this.selectedItems.length,\n })\n : ''}\n </div>`\n : nothing}\n ${this.feedback &&\n html`<dap-ds-feedback\n part=\"feedback\"\n feedbackType=${ifDefined(this.feedbackType)}\n feedbackSize=\"${ifDefined(this.size as 'lg' | 'sm' | 'xs')}\"\n id=\"feedback\">\n ${this.feedback}\n </dap-ds-feedback>`}\n </div>`\n }\n}\n"],"names":["_ComboboxBaseElement","GenericFormElement","event","__async","_a","lastItem","item","_b","hasOptions","input","path","_d","_c","_changedProperties","__superGet","resolve","options","opt","underlyingValue","values","v","option","newValue","mutations","shouldUpdateState","mutation","addedOptions","node","removedOptions","hasInputValue","name","_old","value","inputValue","text","hadValue","selected","foundAny","val","start","end","controlValueLength","getValidityStateObject","t","size","html","e","nothing","clsx","ifDefined","isAutocompleteOrManual","showLoadingSpinner","unsafeCSS","styles","ComboboxBaseElement","__decorateClass","query","property","state"],"mappings":"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"}
1
+ {"version":3,"file":"comboboxBase.js","sources":["../../../src/components/combobox/comboboxBase.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { html } from 'lit/static-html.js'\n\nimport { PopupPlacement } from '@/common/types'\nimport { getValidityStateObject, idInScope } from '@/common/utils'\nimport { GenericFormElement } from '@/internal/mixin/genericFormElement'\nimport { t } from '@/localization/localization'\n\nimport DapDSOptionList from '../option-list/option-list.component'\nimport styles from './combobox.scss?inline'\n\nexport default class ComboboxBaseElement extends GenericFormElement {\n @query('input') readonly triggerInput: HTMLInputElement\n @query('dap-ds-option-list') readonly optionList: DapDSOptionList\n @property({ reflect: true }) placement: PopupPlacement = 'bottom-start'\n @property({ type: Boolean, reflect: true }) opened = false\n @property() searchMode: 'none' | 'typehead' | 'autocomplete' | 'manual' =\n 'autocomplete'\n @property({ type: Boolean }) search = false\n @property() clearButton?: string = 'true'\n @property() placeholder: string | null\n @property({ type: Boolean }) sync?: boolean\n @property({ type: Boolean }) allowManualInput?: boolean = false\n @property({ type: Boolean }) searchForText?: boolean = false\n @property({ type: String }) searchOnValueSet? = 'false'\n @property({ type: Boolean }) loading?: boolean = false\n @property({ type: String }) selectable?: string = 'true'\n @property({ type: Boolean }) noAnimation?: boolean = false\n @property({ type: Boolean }) textComplete?: boolean = false\n @property({ type: Boolean }) openOnEmpty?: boolean = false\n @property({ type: Boolean }) disableViewportAutoClose: boolean = false\n @property() searchButtonAriaLabel?: string\n @property({ type: Boolean }) subtle: boolean\n @property({ type: Boolean, reflect: true }) multiselect: boolean = false\n @property({ type: Number, reflect: true }) maxSelections?: number\n\n /** `data-testid` for the clear button. */\n @property() clearButtonTestId = 'combobox-clear-button'\n\n /** `data-testid` for the search button. */\n @property() searchButtonTestId = 'combobox-search-button'\n\n /**\n * When enabled, the search button (the trailing icon button in search mode) is\n * automatically disabled while the input is empty and re-enabled as soon as the\n * user types. Opt-in; does not affect the input itself, which stays editable.\n */\n @property({ type: Boolean }) disableSearchWhenEmpty = false\n\n /** True when the search input currently holds non-whitespace text. */\n private get hasSearchText(): boolean {\n const text = this.selectedText || this.selectedItemText || this.value || ''\n return text.trim().length > 0\n }\n\n @state() selectedItem: any\n\n /**\n * Display text of the selected item. `selectedItem` is either an option element\n * (has `optionText`) when set from `value`, or an option event detail (has `text`)\n * when picked by the user; reading `.text` alone yields \"undefined\" for the former.\n */\n private get selectedItemText(): string {\n return this.selectedItem?.text ?? this.selectedItem?.optionText ?? ''\n }\n @state() selectedItems: any[] = []\n @state() currentItem: any\n @state() selectedText: string\n\n private optionListObserver: MutationObserver | null = null\n private isUserInteraction: boolean = false\n private pendingInitialValues: string[] = []\n\n static readonly styles = unsafeCSS(styles)\n\n protected async firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): Promise<void> {\n super.firstUpdated(_changedProperties)\n\n await this.optionList.updateComplete\n\n // Wait for next frame to ensure slotted options are available\n await new Promise(resolve => requestAnimationFrame(resolve))\n\n // Wait for all option items to complete their updates\n const options = this.getComboboxOptions()\n\n await Promise.all(options.map((opt: any) => opt.updateComplete))\n\n // Get the underlying value, not the computed value from the getter\n const underlyingValue = super.value\n\n if (underlyingValue) {\n if (this.multiselect) {\n // Handle multiselect mode - parse comma-separated values\n const values = underlyingValue\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v)\n // Store initial values to process later when options are ready\n this.pendingInitialValues = values\n // Try to populate immediately if options are available\n this.updateMultipleSelectionsFromValues(values)\n } else {\n // Handle single-select mode\n // Try to find the selected item from available options\n this.selectedItem = this.optionList\n ?.getAllOptions()\n .find(option => option.value === underlyingValue)\n\n if (this.selectedItem) {\n this.selectedText = this.selectedItem.optionText || ''\n } else {\n // If no selected item found, leave selectedText empty\n // It will be updated when options are loaded via updateSelectionFromValue\n this.selectedText = ''\n }\n\n if (\n !this.selectedText &&\n (this.allowManualInput || this.searchMode === 'none')\n ) {\n this.selectedText = underlyingValue\n }\n }\n }\n\n // Set up MutationObserver to watch for dynamic option changes\n this.setupOptionListObserver()\n }\n\n protected updated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(_changedProperties)\n\n // Handle value property changes from outside the component\n // Only process for combobox components, not search components\n // Skip multiselect mode as the setter already handles value updates\n if (\n _changedProperties.has('value') &&\n this.triggerInput &&\n !this.search &&\n !this.multiselect\n ) {\n const newValue = this.value\n if (newValue) {\n this.handleValueChange(newValue)\n } else {\n this.clearSelection()\n }\n }\n\n // Free-text search (searchMode 'none' or allowManualInput) has no option to\n // map onto, so the branch above skips it and the value never reaches the\n // uncontrolled input. Reflect an externally-set value straight into the field\n // so the search box is controllable (e.g. restoring a saved query). Typehead/\n // autocomplete search keeps its existing behaviour. The guard leaves the\n // input untouched when it already matches, so a keystroke — which set the\n // value in the first place — doesn't bounce the caret to the end.\n if (\n _changedProperties.has('value') &&\n this.triggerInput &&\n this.isFreeTextSearch\n ) {\n const newValue = this.value ?? ''\n if (this.triggerInput.value !== newValue) {\n this.triggerInput.value = newValue\n }\n this.selectedText = newValue\n }\n }\n\n private get isFreeTextSearch(): boolean {\n return (\n Boolean(this.search) &&\n (this.searchMode === 'none' || Boolean(this.allowManualInput))\n )\n }\n\n /**\n * Handles value changes from outside the component\n * This ensures the selection state is updated when the value is set programmatically\n */\n private handleValueChange(newValue: string): void {\n if (!newValue) return\n\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n // Try to find the option with the new value\n const option = this.getComboboxOptions().find(opt => opt.value === newValue)\n\n if (option) {\n // Option found, update selection\n this.selectedItem = option\n this.selectedText = option.optionText || option.textContent || ''\n\n // Update the input value\n if (this.triggerInput) {\n this.triggerInput.value = this.selectedText\n }\n\n // Trigger re-render\n this.requestUpdate()\n } else {\n // Option not found yet (might be loading)\n this.selectedItem = null\n\n // For search components, preserve the selectedText to maintain search functionality\n // For combobox components, clear it to avoid showing raw values\n if (!this.search) {\n this.selectedText = ''\n\n // Clear input value\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n }\n\n private setupOptionListObserver(): void {\n if (!this.optionList) return\n\n // Disconnect existing observer if any\n if (this.optionListObserver) {\n this.optionListObserver.disconnect()\n }\n\n // Create new observer to watch for changes in the option list\n this.optionListObserver = new MutationObserver(mutations => {\n let shouldUpdateState = false\n\n mutations.forEach(mutation => {\n if (mutation.type === 'childList') {\n // Check if option items were added or removed\n const addedOptions = Array.from(mutation.addedNodes).some(\n node => node.nodeName === 'DAP-DS-OPTION-ITEM',\n )\n const removedOptions = Array.from(mutation.removedNodes).some(\n node => node.nodeName === 'DAP-DS-OPTION-ITEM',\n )\n\n if (addedOptions || removedOptions) {\n shouldUpdateState = true\n }\n }\n })\n\n if (shouldUpdateState) {\n // Update combobox state based on new option list\n this.updateComboboxState()\n }\n })\n\n // Start observing the combobox element itself for slot changes\n // This is needed because remote data is added directly to the combobox element\n this.optionListObserver.observe(this, {\n childList: true,\n subtree: true,\n })\n }\n\n private updateComboboxState(): void {\n // Wait for the next tick to ensure DOM is updated\n requestAnimationFrame(() => {\n // Wait one more tick to ensure options are fully initialized\n requestAnimationFrame(() => {\n const hasOptions = this.getComboboxOptions().length > 0\n const hasInputValue =\n this.triggerInput?.value && this.triggerInput.value.trim() !== ''\n\n // If we have options and the dropdown should be open, show it\n // For search components (this.search = true) or autocomplete mode\n // Only open if this is a user interaction, not programmatic value setting\n if (\n hasOptions &&\n hasInputValue &&\n (this.isAutoComplete || this.search) &&\n this.isUserInteraction\n ) {\n if (!this.opened) {\n this.showDropDown()\n }\n } else if (!hasOptions && !this.openOnEmpty && hasInputValue) {\n // If no options and we don't allow empty, hide the dropdown\n // But only if the user has actually typed something\n this.hideDropDown()\n }\n\n // Handle value restoration when options become available\n if (hasOptions) {\n if (this.multiselect) {\n // For multiselect, check if selectedItems needs to be populated\n if (\n this.selectedItems.length === 0 &&\n this.pendingInitialValues.length > 0\n ) {\n this.updateMultipleSelectionsFromValues(this.pendingInitialValues)\n }\n } else {\n // For single-select, check if selectedItem needs to be populated\n if (this.value && !this.selectedItem) {\n this.updateSelectionFromValue()\n }\n }\n }\n })\n })\n }\n\n /**\n * Updates the selection state based on the current value\n * This is useful when options are loaded asynchronously\n */\n private updateSelectionFromValue(): void {\n if (!this.value) return\n\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n const option = this.getComboboxOptions().find(\n opt => opt.value === this.value,\n )\n\n if (option) {\n this.selectedItem = option\n this.selectedText = option.optionText || option.textContent || ''\n\n // Update the input value to show the selected text\n if (this.triggerInput) {\n this.triggerInput.value = this.selectedText\n }\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n }\n }\n\n private cleanupOptionListObserver(): void {\n if (this.optionListObserver) {\n this.optionListObserver.disconnect()\n this.optionListObserver = null\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n this.cleanupOptionListObserver()\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null,\n ): void {\n if (name === 'value' && !value) {\n this.clearSelection()\n }\n\n super.attributeChangedCallback(name, _old, value)\n }\n\n get isAutoComplete() {\n return this.searchMode === 'autocomplete' || this.searchMode === 'manual'\n }\n\n /**\n * Get all option items directly from the combobox element\n * This is more reliable for dynamic updates than the option list component\n */\n private getComboboxOptions(): any[] {\n return Array.from(this.querySelectorAll('dap-ds-option-item'))\n }\n\n get isOpenOnEmpty() {\n return (\n this.openOnEmpty ||\n (!this.openOnEmpty && this.getComboboxOptions().length > 0)\n )\n }\n\n get isOpenOnAutocomplete() {\n return this.isAutoComplete && this.isOpenOnEmpty\n }\n\n get shouldHideClearIcon() {\n // Check if input is empty (cross-browser compatible)\n const inputValue = this.triggerInput?.value || ''\n const hasPlaceholder = this.placeholder && this.placeholder.trim() !== ''\n\n // Only apply JavaScript fallback when there's no placeholder\n // When there IS a placeholder, let CSS :placeholder-shown handle it\n if (hasPlaceholder) {\n return false // Let CSS handle it\n }\n\n // Hide clear icon when input is empty and has no placeholder\n return inputValue === ''\n }\n\n handleClick = () => {\n if (!this.getComboboxOptions().length && !this.openOnEmpty) {\n this.hideDropDown()\n } else {\n this.opened ? this.hideDropDown() : this.showDropDown()\n }\n }\n\n private async handleEnterKey(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n\n if (this.allowManualInput) {\n return this.handleSearchEnter()\n }\n\n if (this.currentItem && this.opened) {\n return this.handleCurrentItemEnter()\n }\n\n if (this.search && !this.isAutoComplete) {\n return this.handleSearchEnter()\n }\n\n return this.handleDefaultEnter()\n }\n\n private async handleCurrentItemEnter() {\n if (this.currentItem.value === this.selectedItem?.value) {\n this.hideDropDown()\n this.triggerInput.value = this.selectedItemText\n this.triggerInput.focus()\n return\n }\n\n if (this.currentItem.value !== this.selectedItem?.value) {\n if (!this.searchForText) {\n await this.handleSelectedItemChange(this.currentItem)\n } else {\n await this.handleTextSearch(this.currentItem.text)\n }\n }\n }\n\n private async handleSearchEnter() {\n this.emit('dds-search', { search: this.selectedText })\n this.setValidity()\n return this.hideDropDown()\n }\n\n private async handleDefaultEnter() {\n if (this.opened) {\n return this.hideDropDown()\n } else {\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n return (\n (this.openOnEmpty ||\n this.getComboboxOptions().length ||\n this.isAutoComplete) &&\n this.showDropDown()\n )\n }\n }\n\n private async handleSelectedItemChange(item: any) {\n this.selectedItem = item\n this.emit('dds-change', {\n value: this.selectedItem.value,\n selectedItem: this.selectedItem,\n type: 'select',\n })\n await this.updateComplete\n this.value = this.selectedItem.value\n this.selectedText = this.currentItem.text\n this.triggerInput.value = this.currentItem.text\n this.triggerInput.focus()\n this.setValidity()\n // Close like a pick from the list does (handleSelectedChange); multiselect stays open\n if (!this.multiselect) {\n await this.hideDropDown()\n }\n }\n\n private async handleTextSearch(text: string) {\n this.value = text\n this.selectedText = text\n this.triggerInput.value = text\n this.triggerInput.focus()\n this.emit('dds-search', { search: text })\n this.setValidity()\n await this.hideDropDown()\n }\n\n private async handleArrowKeys(event: KeyboardEvent) {\n event.preventDefault()\n\n if (!this.opened) {\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n if (\n this.openOnEmpty ||\n this.getComboboxOptions().length ||\n this.isAutoComplete\n ) {\n this.showDropDown()\n } else {\n return // Don't proceed if we can't open dropdown\n }\n }\n\n await this.updateComplete\n this.optionList.captureFocus(event.key)\n }\n\n handleKeyDown = async (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n // Close the list so its options leave the tab order; Tab then moves on natively\n this.hideDropDown({ skipFocus: true })\n return\n }\n\n if (event.key === 'Enter') {\n return this.handleEnterKey(event)\n }\n\n if (event.key === 'Escape') {\n this.hideDropDown()\n return this.focus()\n }\n\n // Handle Backspace for chip removal in multiselect mode\n if (event.key === 'Backspace' && this.multiselect) {\n const inputValue = this.triggerInput?.value || ''\n // Only remove chip if input is empty\n if (inputValue === '' && this.selectedItems.length > 0) {\n event.preventDefault()\n const lastItem = this.selectedItems[this.selectedItems.length - 1]\n this.removeSelectedItem(lastItem)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'remove',\n item: lastItem,\n })\n this.setValidity()\n return\n }\n }\n\n if (\n (event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight') &&\n this.isAutoComplete\n ) {\n return this.handleArrowKeys(event)\n }\n\n // For autocomplete mode, only show dropdown if there are options OR if openOnEmpty is true\n if (this.isAutoComplete && this.triggerInput?.value && !this.opened) {\n const hasOptions = this.getComboboxOptions().length > 0\n if (this.openOnEmpty || hasOptions) {\n this.showDropDown()\n }\n }\n }\n\n handleInput = async (event: InputEvent) => {\n const input = this.triggerInput\n\n // Mark this as user interaction\n this.isUserInteraction = true\n if (\n event.inputType !== 'deleteContentBackward' ||\n (event.inputType === 'deleteContentBackward' && this.allowManualInput)\n ) {\n this.selectedText = input.value\n if (this.search) {\n this.value = input.value\n }\n } else if (this.search) {\n this.selectedText = input.value\n this.value = input.value\n } else if (\n input.value === '' &&\n event.inputType === 'deleteContentBackward'\n ) {\n this.clearSelection()\n }\n\n this.emit('dds-input', { input: input.value, originalEvent: event })\n this.setValidity()\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n // For autocomplete mode, only show dropdown if there are options OR if openOnEmpty is true\n if (this.isAutoComplete && input.value && !this.opened) {\n const hasOptions = this.getComboboxOptions().length > 0\n if (this.openOnEmpty || hasOptions) {\n this.showDropDown()\n }\n }\n }\n\n async clearSelection() {\n // Mark this as programmatic change, not user interaction\n this.isUserInteraction = false\n\n // Was there anything to clear? Clearing an already-empty control (e.g. a\n // programmatic `value = ''` on mount) must stay silent — otherwise it fires\n // dds-change as if the user cleared a value, which a consumer reads as an\n // edit. A real clear (the × button on a filled field) still emits.\n const hadValue = Boolean(\n this.value || this.selectedText || this.triggerInput?.value,\n )\n\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n this.selectedText = ''\n this.selectedItem = null\n\n this.value = undefined\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n await this.updateComplete\n\n if (hadValue) {\n this.emit('dds-change', this.selectedItem)\n }\n }\n\n /**\n * Multiselect helper methods\n */\n private getSelectedValues(): string[] {\n return this.selectedItems.map(item => item.value)\n }\n\n private isMaxSelectionsReached(): boolean {\n if (!this.maxSelections) return false\n return this.selectedItems.length >= this.maxSelections\n }\n\n private addSelectedItem(item: any): void {\n if (!this.multiselect) return\n\n // Check if item is already selected\n const isAlreadySelected = this.selectedItems.some(\n selected => selected.value === item.value,\n )\n\n if (isAlreadySelected) return\n\n // Check max selections limit\n if (this.isMaxSelectionsReached()) return\n\n // Add item to selectedItems array\n this.selectedItems = [...this.selectedItems, item]\n\n // Update value to comma-separated string (use super to avoid setter loop)\n const newValue = this.getSelectedValues().join(',')\n super.value = newValue\n\n // Clear input text\n this.selectedText = ''\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private removeSelectedItem(item: any): void {\n if (!this.multiselect) return\n\n // Remove item from selectedItems array\n this.selectedItems = this.selectedItems.filter(\n selected => selected.value !== item.value,\n )\n\n // Update value to comma-separated string (use super to avoid setter loop)\n if (this.selectedItems.length === 0) {\n super.value = undefined\n } else {\n const newValue = this.getSelectedValues().join(',')\n super.value = newValue\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private clearAllSelections(): void {\n if (!this.multiselect) return\n\n // Clear all selections\n this.selectedItems = []\n super.value = undefined\n this.selectedText = ''\n\n if (this.triggerInput) {\n this.triggerInput.value = ''\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n private updateMultipleSelectionsFromValues(values: string[]): void {\n if (!this.multiselect) return\n\n const options = this.getComboboxOptions()\n\n // Don't clear if we've already populated items\n const shouldClear = this.selectedItems.length === 0\n if (shouldClear) {\n this.selectedItems = []\n }\n\n let foundAny = false\n values.forEach(value => {\n // Check both property and attribute since elements might not be fully upgraded\n const option = options.find(\n opt => opt.value === value || opt.getAttribute('value') === value,\n )\n if (option) {\n // Check if already in selectedItems to avoid duplicates\n const exists = this.selectedItems.some(item => item.value === value)\n if (!exists) {\n this.selectedItems.push(option)\n foundAny = true\n }\n }\n })\n\n // Clear pending values if we successfully found items\n if (foundAny && this.pendingInitialValues.length > 0) {\n this.pendingInitialValues = []\n }\n\n // Trigger re-render\n this.requestUpdate()\n }\n\n /**\n * Override value getter/setter to handle multiselect mode\n */\n override get value(): string | undefined {\n if (this.multiselect) {\n const values = this.getSelectedValues()\n const result = values.length > 0 ? values.join(',') : undefined\n return result\n }\n return super.value\n }\n\n override set value(val: string | undefined) {\n if (this.multiselect) {\n // Parse comma-separated values\n const values = val\n ? val\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v)\n : []\n\n // Store as pending if we have values and selectedItems is empty\n // This ensures initial values are processed even if set after component is created\n if (values.length > 0 && this.selectedItems.length === 0) {\n this.pendingInitialValues = values\n }\n\n this.updateMultipleSelectionsFromValues(values)\n\n // Update parent value\n super.value = val\n } else {\n // Single select mode - use parent implementation\n super.value = val\n }\n }\n\n handleListKeyDown = (event: CustomEvent) => {\n if (event.detail?.key === 'Tab') {\n // Move focus back to the input synchronously so the native Tab continues\n // from there and leaves the combobox instead of cycling inside the list.\n this.hideDropDown({ skipFocus: true })\n this.triggerInput.focus()\n return\n }\n\n if (event.detail?.key === 'Escape') {\n this.hideDropDown()\n this.currentItem = this.selectedItem\n this.selectedText = ''\n // Nothing selected yet (user only typed): keep the typed text\n if (this.selectedItem) {\n this.triggerInput.value = this.selectedItemText\n }\n this.triggerInput.focus()\n }\n }\n\n handleDocumentMouseDown = (event: MouseEvent) => {\n const path = event.composedPath()\n if (this && !path.includes(this)) {\n this.hideDropDown()\n }\n }\n\n private readonly handlePopupAutoClose = () => {\n this.hideDropDown({ skipFocus: true })\n }\n\n handleFocus = () => {\n this.emit('dds-focus')\n }\n\n handleBlur = () => {\n this.emit('dds-blur')\n }\n\n async showDropDown() {\n if (this.disabled || this.readonly || !this.isAutoComplete || this.opened) {\n return\n }\n\n // For autocomplete mode, allow opening even without options initially\n // The MutationObserver will handle showing/hiding based on actual option availability\n if (\n !this.openOnEmpty &&\n !this.getComboboxOptions().length &&\n !this.isAutoComplete\n ) {\n return\n }\n\n this.opened = true\n\n document.addEventListener('mousedown', this.handleDocumentMouseDown)\n }\n\n async hideDropDown(options?: { skipFocus?: boolean }) {\n if (!this.opened) {\n return\n }\n\n this.opened = false\n\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n\n await this.updateComplete\n if (!options?.skipFocus) {\n this.focus()\n }\n this.clearSelectionRange()\n }\n\n public get focusElement() {\n return this.triggerInput\n }\n\n handleSelectedChange = async (event: CustomEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (this.searchForText) {\n this.selectedText = event.detail.text\n this.value = event.detail.text\n this.triggerInput.value = event.detail.text\n\n this.emit('dds-search', { search: this.selectedText })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n this.setValidity()\n } else if (this.multiselect) {\n // Multiselect mode - add item to selected items\n this.addSelectedItem(event.detail)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'add',\n item: event.detail,\n })\n\n // Clear current item to prevent text completion from filling it back in\n this.currentItem = null\n\n // Wait for update to complete before focusing\n await this.updateComplete\n\n // Ensure input is cleared after render\n this.triggerInput.value = ''\n this.triggerInput.focus()\n this.setValidity()\n\n // Don't close dropdown in multiselect mode\n return\n } else {\n this.selectedItem = event.detail\n this.selectedText = event.detail.text\n\n if (this.value !== this.selectedItem?.value) {\n this.triggerInput.value = event.detail.text\n this.value = this.selectedItem.value\n this.emit('dds-change', {\n value: this.selectedItem.value,\n selectedItem: this.selectedItem,\n type: 'select',\n })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n await this.updateComplete\n\n if (this.currentItem) {\n this.triggerInput.value = this.currentItem.text\n }\n this.triggerInput.focus()\n this.setValidity()\n }\n }\n\n this.hideDropDown()\n }\n\n handleOptionDeselect = (event: CustomEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n this.selectedItem = null\n this.selectedText = ''\n this.value = undefined\n this.triggerInput.value = ''\n this.emit('dds-change', {\n value: undefined,\n selectedItem: null,\n type: 'deselect',\n })\n\n // Trigger re-render to update clear icon visibility\n this.requestUpdate()\n\n this.setValidity()\n }\n\n handleCurrentOptionChange = (event: CustomEvent) => {\n this.currentItem = event.detail\n\n // Skip text completion in multiselect mode\n if (this.multiselect) {\n return\n }\n\n if (event.detail) {\n if (\n this.textComplete &&\n this.searchMode !== 'manual' &&\n this.searchMode !== 'none'\n ) {\n this.triggerInput.value = event.detail.text\n }\n\n if (\n this.isAutoComplete &&\n this.selectedText &&\n this.selectedText !== '' &&\n !this.allowManualInput &&\n this.textComplete\n ) {\n this.triggerInput.value = event.detail.text\n this.setSelectionRange(\n this.selectedText.length,\n this.triggerInput.value.length,\n )\n }\n }\n }\n\n handleListChanged = (event: CustomEvent) => {\n if (!event.detail.elements.length && !this.openOnEmpty) {\n this.hideDropDown()\n }\n }\n\n handleClearClick = () => {\n if (!this.disabled) {\n if (this.multiselect) {\n this.clearAllSelections()\n } else {\n this.clearSelection()\n }\n\n this.triggerInput.focus()\n this.setValidity()\n\n if (!this.openOnEmpty) {\n this.hideDropDown()\n }\n\n this.emit('dds-clear')\n }\n }\n\n handleSearchClick = (event: MouseEvent) => {\n event.stopPropagation()\n event.preventDefault()\n\n this.setValidity()\n this.emit('dds-search', { search: this.selectedText })\n }\n\n private setSelectionRange(start: number, end: number) {\n this.triggerInput.setSelectionRange(start, end)\n }\n\n private clearSelectionRange() {\n const controlValueLength = this.triggerInput.value.length\n\n this.setSelectionRange(controlValueLength, controlValueLength)\n }\n\n getValidity() {\n if (this.multiselect) {\n return this.getMultiSelectValidity()\n }\n if (this.isAutoComplete) {\n return this.getAutoCompleteValidity()\n }\n return this.getBasicValidity()\n }\n\n formResetCallback() {\n this.internals.setValidity({})\n this.internals.setFormValue(this.defaultValue)\n this.value = this.defaultValue\n if (this.multiselect) {\n this.selectedItems = []\n } else {\n // Resolve to the option element; a bare value string has no value/text fields\n this.selectedItem =\n this.getComboboxOptions().find(\n option => option.value === this.defaultValue,\n ) ?? null\n }\n }\n\n private getMultiSelectValidity(): boolean {\n // Valid if not required OR has at least one selection\n return !this.required || this.selectedItems.length > 0\n }\n\n private getAutoCompleteValidity(): boolean {\n if (this.allowManualInput) {\n return this.getManualInputValidity()\n }\n if (this.searchForText) {\n return this.getSearchTextValidity()\n }\n return this.getSelectedItemValidity()\n }\n\n private getManualInputValidity(): boolean {\n return (\n this.triggerInput.value !== '' ||\n (this.selectedItem !== null && this.selectedItem !== undefined)\n )\n }\n\n private getSearchTextValidity(): boolean {\n return this.triggerInput.value !== ''\n }\n\n private getSelectedItemValidity(): boolean {\n return !!this.selectedItem\n }\n\n private getBasicValidity(): boolean {\n return this.triggerInput.value !== ''\n }\n\n // custom validation\n get validity(): ValidityState {\n if (this.internals.validity) {\n return this.internals.validity\n } else {\n return getValidityStateObject({\n valueMissing: this.required && !this.getValidity(),\n })\n }\n }\n\n get validationMessage(): string {\n return t('form.validationMessage.select')\n }\n\n checkValidity() {\n return this.required ? this.getValidity() : true\n }\n\n reportValidity() {\n return this.required ? this.checkValidity() : true\n }\n\n setValidity() {\n if (!this.checkValidity()) {\n this.internals.setValidity(\n {\n valueMissing: this.required && !this.getValidity(),\n },\n this.validationMessage,\n this.triggerInput,\n )\n } else {\n this.internals.setValidity({})\n }\n }\n\n handleInvalid(event: Event) {\n event.preventDefault()\n }\n\n /**\n * Screen-reader status for the highlighted option while focus stays in the input.\n * aria-activedescendant cannot reach options inside option-list's shadow root, so\n * the highlight (e.g. the first match after typing) is announced through a polite\n * live region instead. Once focus moves onto an option it is announced natively,\n * so the status is cleared to avoid a double announcement.\n */\n get activeOptionStatus(): string {\n if (\n !this.opened ||\n !this.currentItem ||\n this.shadowRoot?.activeElement !== this.triggerInput\n ) {\n return ''\n }\n\n const options = this.optionList?.getAllAvailabeOptions() ?? []\n const index = options.findIndex(\n option => option.value === this.currentItem.value,\n )\n if (index < 0) {\n return ''\n }\n\n return t('combobox.activeOption', {\n option: this.currentItem.text,\n position: index + 1,\n count: options.length,\n })\n }\n\n getActiveDescendant() {\n if (!this.opened) {\n return this.triggerInput\n }\n\n const activeOption = this.optionList?.getActiveOption()\n return activeOption\n }\n\n getSearchIconSize(size: string) {\n switch (size) {\n case 'sm':\n return 'md'\n case 'lg':\n return 'lg'\n case 'xs':\n return 'sm'\n default:\n return 'md'\n }\n }\n\n getInnerIconSize(size: string) {\n switch (size) {\n case 'sm':\n return 16\n case 'lg':\n return 16\n case 'xs':\n return 10\n default:\n return 16\n }\n }\n\n private handleChipRemove = (event: CustomEvent, item: any) => {\n event.stopPropagation()\n this.removeSelectedItem(item)\n this.emit('dds-change', {\n value: this.selectedItems.map(item => item.value).join(','),\n selectedItems: this.selectedItems,\n type: 'remove',\n item: item,\n })\n this.setValidity()\n\n // Focus input after removal\n this.triggerInput.focus()\n }\n\n private renderChip(item: any) {\n // Get text from the option element - prefer optionText getter, then textContent\n const text = item.optionText || item.textContent || item.text || ''\n\n return html`\n <dap-ds-chip\n size=\"sm\"\n removeable\n .value=${item.value}\n @dds-remove=${(e: CustomEvent) => this.handleChipRemove(e, item)}>\n ${text}\n </dap-ds-chip>\n `\n }\n\n private renderChips() {\n if (!this.multiselect || this.selectedItems.length === 0) {\n return nothing\n }\n\n return html`\n <div class=\"combobox__chips\" part=\"chips\">\n ${this.selectedItems.map(item => this.renderChip(item))}\n </div>\n `\n }\n\n private renderInput() {\n // In multiselect mode, only show selectedText (typing), never show selectedItem\n const inputValue = this.multiselect\n ? this.selectedText\n : this.selectedText !== ''\n ? this.selectedText\n : this.selectedItemText\n\n return html`<input\n id=\"input\"\n part=\"input\"\n role=\"combobox\"\n class=\"${clsx('input', `input--${this.size}`, {\n 'input--disabled': this.disabled,\n 'input--readonly': this.readonly,\n 'input--multiselect': this.multiselect,\n })}\"\n aria-expanded=${this.opened ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-labelledby=\"label\"\n aria-describedby=\"description ${this.feedback ? 'feedback' : ''}\"\n aria-disabled=${this.disabled}\n aria-autocomplete=\"both\"\n aria-controls=\"option-list\"\n aria-activedescendant=${ifDefined(\n // Options render in option-list's shadow root, out of this scope; a\n // cross-scope IDREF is ignored by browsers, so only same-scope ids are set\n idInScope(this.shadowRoot, this.getActiveDescendant()),\n )}\n ?required=${this.required}\n ?readonly=${this.readonly}\n ?autofocus=${this.autofocus}\n autocomplete=${this.autocomplete as any}\n ?disabled=${this.disabled}\n value=${inputValue}\n placeholder=${ifDefined(this.placeholder ?? '')}\n type=${this.search ? 'search' : 'text'}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @click=${this.handleClick} />`\n }\n\n private renderClearButton() {\n if (this.clearButton !== 'true' || this.readonly) return nothing\n\n return html`<div\n class=\"${clsx('clear-icon', {\n 'clear-icon--hidden': this.shouldHideClearIcon,\n })}\">\n <dap-ds-icon-button\n icon=\"close-line\"\n data-testid=${this.clearButtonTestId}\n aria-label=${t('clear')}\n ?disabled=${this.disabled}\n @click=${this.handleClearClick}></dap-ds-icon-button>\n </div>`\n }\n\n private renderIndicatorIcon() {\n const isAutocompleteOrManual =\n this.searchMode === 'autocomplete' || this.searchMode === 'manual'\n const showLoadingSpinner = this.loading\n ? html`<dap-ds-icon-loading-spinner></dap-ds-icon-loading-spinner>`\n : null\n\n if (isAutocompleteOrManual && !this.search) {\n return html`<div\n class=\"${clsx('indicator-icon', {\n 'indicator-icon--loading': this.loading,\n })}\"\n part=\"indicator-icon\">\n ${showLoadingSpinner ||\n html`<slot name=\"indicator-icon\"\n ><dap-ds-icon-arrow-down-s-line\n aria-hidden=\"true\"\n @click=${this.handleClick}>\n </dap-ds-icon-arrow-down-s-line\n ></slot>`}\n </div>`\n }\n\n if (this.search) {\n return html`<div\n class=\"${clsx('indicator-icon', {\n 'indicator-icon--loading': this.loading,\n })}\">\n ${showLoadingSpinner ||\n html`<dap-ds-icon-button\n part=\"search-button\"\n size=${this.getSearchIconSize(this.size)}\n variant=${this.subtle ? 'neutral' : 'inverted-brand'}\n icon=\"search-line\"\n ?disabled=${this.disableSearchWhenEmpty && !this.hasSearchText}\n data-testid=${this.searchButtonTestId}\n iconSize=${this.getInnerIconSize(this.size)}\n aria-label=${this.searchButtonAriaLabel ?? t('search')}\n @click=${this.handleSearchClick}>\n </dap-ds-icon-button>`}\n </div>`\n }\n\n return nothing\n }\n\n private renderSelectActions() {\n return html`<div\n class=\"${clsx('select-action', `select-action--${this.size}`, {\n 'select-action--disabled': this.disabled,\n 'select-action--readonly': this.readonly,\n 'select-action--opened': this.opened,\n 'select-action--multiselect': this.multiselect,\n })}\">\n ${this.renderClearButton()} ${this.renderIndicatorIcon()}\n </div>`\n }\n\n private renderOptionList() {\n return html`<dap-ds-option-list\n class=\"option-list\"\n part=\"option-list\"\n id=\"option-list\"\n .search=${this.search}\n searchMode=${this.allowManualInput ? 'none' : this.searchMode}\n searchOnValueSet=${this.searchOnValueSet === 'true'}\n filterText=${this.selectedText}\n size=${ifDefined(this.size)}\n value=${ifDefined(this.value)}\n selectable=${ifDefined(this.selectable)}\n ?multiselectable=${this.multiselect}\n @dds-option-change=${this.handleSelectedChange}\n @dds-option-deselect=${this.handleOptionDeselect}\n @dds-keydown=${this.handleListKeyDown}\n @dds-current-change=${this.handleCurrentOptionChange}\n @dds-list-changed=${this.handleListChanged}>\n <slot></slot>\n </dap-ds-option-list>`\n }\n\n renderCombobox() {\n return html` ${(this, this.renderLabel())}\n <div>\n <dap-ds-popup\n part=\"base\"\n class=\"select-popup\"\n overflow\n ?opened=${this.opened}\n ?hasArrow=${false}\n placement=${this.placement}\n floatingStrategy=\"fixed\"\n offset=\"4\"\n ?sync=${this.sync}\n ?disableViewportAutoClose=${this.disableViewportAutoClose}\n @dds-close=${this.handlePopupAutoClose}\n @dds-closed=${this.hideDropDown}\n @dds-opened=${this.showDropDown}>\n <div\n slot=\"trigger\"\n part=\"trigger\"\n class=\"${clsx('select', `select--${this.size}`, {\n 'select--disabled': this.disabled,\n 'select--readonly': this.readonly,\n 'select--opened': this.opened,\n 'select--loading': this.loading,\n 'select--success': this.status === 'success',\n 'select--error': this.status === 'error',\n 'select--no-animation': this.noAnimation,\n 'select--multiselect': this.multiselect,\n })}\">\n ${this.renderChips()} ${this.renderInput()}\n ${this.renderSelectActions()}\n </div>\n ${this.renderOptionList()}\n </dap-ds-popup>\n <div\n class=\"sr-only active-option-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\">\n ${this.activeOptionStatus}\n </div>\n ${this.multiselect\n ? html`<div\n class=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\">\n ${this.selectedItems.length > 0\n ? t('combobox.multiselect.selected', {\n count: this.selectedItems.length,\n })\n : ''}\n </div>`\n : nothing}\n ${this.feedback &&\n html`<dap-ds-feedback\n part=\"feedback\"\n feedbackType=${ifDefined(this.feedbackType)}\n feedbackSize=\"${ifDefined(this.size as 'lg' | 'sm' | 'xs')}\"\n id=\"feedback\">\n ${this.feedback}\n </dap-ds-feedback>`}\n </div>`\n }\n}\n"],"names":["_ComboboxBaseElement","GenericFormElement","event","__async","_a","lastItem","item","_b","hasOptions","input","path","_d","_c","_changedProperties","__superGet","resolve","options","opt","underlyingValue","values","v","option","newValue","mutations","shouldUpdateState","mutation","addedOptions","node","removedOptions","hasInputValue","name","_old","value","inputValue","text","hadValue","selected","foundAny","val","start","end","controlValueLength","getValidityStateObject","t","index","size","html","e","nothing","clsx","ifDefined","idInScope","isAutocompleteOrManual","showLoadingSpinner","unsafeCSS","styles","ComboboxBaseElement","__decorateClass","query","property","state"],"mappings":"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"}
@@ -55,6 +55,8 @@ export default class DapDSOptionList extends DapDSOptionList_base {
55
55
  * @ignore
56
56
  */
57
57
  disableDelaySet: boolean;
58
+ /** Whether multiple options can be selected; exposed as aria-multiselectable on the listbox. */
59
+ multiselectable: boolean;
58
60
  queryTimeout: number | undefined;
59
61
  queryString: string;
60
62
  firstLoad: boolean;
@@ -14,7 +14,7 @@ import "../../node_modules/@lit/reactive-element/reactive-element.js";
14
14
  import "../../node_modules/lit-html/lit-html.js";
15
15
  import "../../node_modules/lit-element/lit-element.js";
16
16
  import { property as d } from "../../node_modules/@lit/reactive-element/decorators/property.js";
17
- import { state as c } from "../../node_modules/@lit/reactive-element/decorators/state.js";
17
+ import { state as p } from "../../node_modules/@lit/reactive-element/decorators/state.js";
18
18
  import { ifDefined as O } from "../../node_modules/lit-html/directives/if-defined.js";
19
19
  import { unsafeStatic as y, html as v } from "../../node_modules/lit-html/static.js";
20
20
  import { scrollIntoContainer as I } from "../../common/utils.js";
@@ -23,21 +23,21 @@ import { SizedMixin as S } from "../../internal/mixin/sizedMixin.js";
23
23
  import A from "../option-item/option-item.component.js";
24
24
  import E from "./option-list.scss.js";
25
25
  import { unsafeCSS as T } from "../../node_modules/@lit/reactive-element/css-tag.js";
26
- var w = Object.defineProperty, a = (o, e, t, i) => {
27
- for (var s = void 0, l = o.length - 1, p; l >= 0; l--)
28
- (p = o[l]) && (s = p(e, t, s) || s);
26
+ var w = Object.defineProperty, n = (o, e, t, i) => {
27
+ for (var s = void 0, l = o.length - 1, c; l >= 0; l--)
28
+ (c = o[l]) && (s = c(e, t, s) || s);
29
29
  return s && w(e, t, s), s;
30
30
  };
31
31
  const r = class r extends S(C) {
32
32
  constructor() {
33
- super(...arguments), this.filterText = "", this.focused = !1, this.search = !1, this.searchMode = "none", this.searchOnValueSet = "true", this.selectable = "true", this.disableDelaySet = !1, this.queryString = "", this.firstLoad = !0, this.optionEls = [], this.availableOptions = [], this.handleOptionClick = (e) => {
33
+ super(...arguments), this.filterText = "", this.focused = !1, this.search = !1, this.searchMode = "none", this.searchOnValueSet = "true", this.selectable = "true", this.disableDelaySet = !1, this.multiselectable = !1, this.queryString = "", this.firstLoad = !0, this.optionEls = [], this.availableOptions = [], this.handleOptionClick = (e) => {
34
34
  this.focused = !0;
35
35
  const t = e.target;
36
36
  if (t && !t.disabled) {
37
37
  const i = e.ctrlKey || e.metaKey, s = t.selected;
38
38
  if (i && s) {
39
39
  const l = this.availableOptions.find(
40
- (p) => p.hasAttribute("empty")
40
+ (c) => c.hasAttribute("empty")
41
41
  );
42
42
  l ? (this.setSelectedOption(l), this.setCurrentOption(l), this.value = l.value, this.selectedIndex = this.findIndexByValue(
43
43
  this.availableOptions,
@@ -97,7 +97,7 @@ const r = class r extends S(C) {
97
97
  ) : null;
98
98
  }
99
99
  updated(e) {
100
- if (super.updated(e), e.has("value") && !e.has("currentOption") && this.searchOnValueSet === "true") {
100
+ if (super.updated(e), e.has("multiselectable") && (this.multiselectable ? this.setAttribute("aria-multiselectable", "true") : this.removeAttribute("aria-multiselectable")), e.has("value") && !e.has("currentOption") && this.searchOnValueSet === "true") {
101
101
  const t = this.availableOptions.find(
102
102
  (i) => i.value === this.value
103
103
  );
@@ -304,47 +304,50 @@ const r = class r extends S(C) {
304
304
  r.tagName = "dap-ds-option-list", r.dependencies = {
305
305
  "dap-ds-option-item": A
306
306
  }, r.styles = T(E);
307
- let n = r;
308
- a([
307
+ let a = r;
308
+ n([
309
309
  d()
310
- ], n.prototype, "filterText");
311
- a([
310
+ ], a.prototype, "filterText");
311
+ n([
312
312
  d({ type: String, reflect: !0 })
313
- ], n.prototype, "value");
314
- a([
313
+ ], a.prototype, "value");
314
+ n([
315
315
  d({ type: Boolean })
316
- ], n.prototype, "focused");
317
- a([
316
+ ], a.prototype, "focused");
317
+ n([
318
318
  d({ type: Boolean })
319
- ], n.prototype, "search");
320
- a([
319
+ ], a.prototype, "search");
320
+ n([
321
321
  d()
322
- ], n.prototype, "searchMode");
323
- a([
322
+ ], a.prototype, "searchMode");
323
+ n([
324
324
  d({ type: String })
325
- ], n.prototype, "searchOnValueSet");
326
- a([
325
+ ], a.prototype, "searchOnValueSet");
326
+ n([
327
327
  d({ type: String })
328
- ], n.prototype, "selectable");
329
- a([
328
+ ], a.prototype, "selectable");
329
+ n([
330
330
  d({ type: Array })
331
- ], n.prototype, "options");
332
- a([
331
+ ], a.prototype, "options");
332
+ n([
333
333
  d({ type: Boolean })
334
- ], n.prototype, "disableDelaySet");
335
- a([
336
- c()
337
- ], n.prototype, "currentOption");
338
- a([
339
- c()
340
- ], n.prototype, "selectedIndex");
341
- a([
342
- c()
343
- ], n.prototype, "optionEls");
344
- a([
345
- c()
346
- ], n.prototype, "availableOptions");
334
+ ], a.prototype, "disableDelaySet");
335
+ n([
336
+ d({ type: Boolean })
337
+ ], a.prototype, "multiselectable");
338
+ n([
339
+ p()
340
+ ], a.prototype, "currentOption");
341
+ n([
342
+ p()
343
+ ], a.prototype, "selectedIndex");
344
+ n([
345
+ p()
346
+ ], a.prototype, "optionEls");
347
+ n([
348
+ p()
349
+ ], a.prototype, "availableOptions");
347
350
  export {
348
- n as default
351
+ a as default
349
352
  };
350
353
  //# sourceMappingURL=option-list.component.js.map