dap-design-system 0.62.0 → 0.62.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/combobox/comboboxBase.d.ts +6 -0
- package/dist/components/combobox/comboboxBase.js +79 -61
- package/dist/components/combobox/comboboxBase.js.map +1 -1
- package/dist/components/command/command-item.scss.js +1 -1
- package/dist/components/command/command.component.js +12 -12
- package/dist/components/command/command.component.js.map +1 -1
- package/dist/components/datatable/datatable.component.d.ts +2 -0
- package/dist/components/datatable/datatable.component.js +131 -112
- package/dist/components/datatable/datatable.component.js.map +1 -1
- package/dist/components/datatable/datatable.scss.js +1 -1
- package/dist/components/icon-button/icon-button.component.js +15 -12
- package/dist/components/icon-button/icon-button.component.js.map +1 -1
- package/dist/components/input/input-base-element.js +42 -38
- package/dist/components/input/input-base-element.js.map +1 -1
- package/dist/components/input/input.component.d.ts +1 -0
- package/dist/components/input/input.component.js.map +1 -1
- package/dist/components/option-list/option-list.component.js +16 -12
- package/dist/components/option-list/option-list.component.js.map +1 -1
- package/dist/components/select/select.component.js +71 -66
- package/dist/components/select/select.component.js.map +1 -1
- package/dist/components/snackbar/snackbar-message.component.js +16 -18
- package/dist/components/snackbar/snackbar-message.component.js.map +1 -1
- package/dist/components/snackbar/snackbar.component.js +48 -35
- package/dist/components/snackbar/snackbar.component.js.map +1 -1
- package/dist/components/table/table.component.d.ts +3 -0
- package/dist/components/table/table.component.js +30 -27
- package/dist/components/table/table.component.js.map +1 -1
- package/dist/components/textarea/textarea.component.d.ts +6 -1
- package/dist/components/textarea/textarea.component.js +43 -36
- package/dist/components/textarea/textarea.component.js.map +1 -1
- package/dist/components/tooltip/tooltip.component.d.ts +2 -0
- package/dist/components/tooltip/tooltip.component.js +51 -53
- package/dist/components/tooltip/tooltip.component.js.map +1 -1
- package/dist/internal/mixin/labelableMixin.d.ts +3 -0
- package/dist/internal/mixin/labelableMixin.js +15 -12
- package/dist/internal/mixin/labelableMixin.js.map +1 -1
- package/dist/manifest/types/vue/index.d.ts +87 -84
- package/dist/manifest/vscode.html-custom-data.json +64 -60
- package/dist/manifest/web-types.json +83 -73
- package/dist/react/dap-ds-input/index.d.ts +1 -0
- package/dist/react/dap-ds-input/index.js.map +1 -1
- package/dist/react/index.d.ts +4 -4
- package/dist/react-types.ts +4 -4
- package/dist/react.js +22 -22
- package/package.json +1 -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 =\n this.selectedText || this.selectedItem?.text || this.value || ''\n return text.trim().length > 0\n }\n\n @state() selectedItem: any\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.selectedItem.text\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 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 === 'Escape') {\n this.hideDropDown()\n this.currentItem = this.selectedItem\n this.selectedText = ''\n this.triggerInput.value = this.selectedItem.text\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 this.selectedItem = this.defaultValue\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.selectedItem?.text || ''\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","_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","_c","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 } 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,4 +1,4 @@
|
|
|
1
|
-
const d = ":host{--dds-command-item-padding: var(--dds-spacing-100) var(--dds-spacing-200);--dds-command-item-background: none;--dds-command-item-color: var(--dds-text-primary-base);--dds-command-item-hover-background: var(--dds-transparent-black-subtle);--dds-command-item-selected-background: var(--dds-transparent-black-subtle);display:flex}.command-item{outline-color:var(--dds-focus-outer-ring);outline-offset:var(--dds-spacing-50);outline-width:var(--dds-border-width-large);transition-property:all;transition-duration:var(--dds-transition-fast);transition-timing-function:var(--dds-easing-ease-in-out);display:flex;align-items:center;width:100%;padding:var(--dds-command-item-padding);border:0;border-radius:var(--dds-radius-small);background:var(--dds-command-item-background);color:var(--dds-command-item-color);font-family:inherit;font-size:var(--dds-font-size-base);font-weight:var(--dds-font-weight-medium);line-height:var(--dds-font-line-height-xlarge);text-align:left;text-decoration:none;cursor:pointer}.command-item:hover:not(.command-item--disabled){background-color:var(--dds-command-item-hover-background)}.command-item:focus:not(.command-item--disabled){outline-style:solid}.command-item.command-item--selected{background-color:var(--dds-command-item-selected-background);color:var(--dds-command-item-color)}.command-item.command-item-selectable--disabled,.command-item.command-item--disabled{opacity:.5;cursor:not-allowed}.command-item__content{display:flex;align-items:center;gap:var(--dds-spacing-100);width:100%}.command-item__content--selectable{display:grid;grid-template-columns:var(--dds-spacing-600) 1fr;align-items:center;justify-content:space-between;gap:var(--dds-spacing-100);width:100%;cursor:pointer}.command-item__label{display:flex;flex:1;align-items:center;gap:var(--dds-spacing-100)}.command-item-check{margin-left:var(--dds-spacing-200);color:var(--dds-text-primary-base)}";
|
|
1
|
+
const d = ":host{--dds-command-item-padding: var(--dds-spacing-100) var(--dds-spacing-200);--dds-command-item-background: none;--dds-command-item-color: var(--dds-text-primary-base);--dds-command-item-hover-background: var(--dds-transparent-black-subtle);--dds-command-item-selected-background: var(--dds-transparent-black-subtle);display:flex}:host([hidden]){display:none}.command-item{outline-color:var(--dds-focus-outer-ring);outline-offset:var(--dds-spacing-50);outline-width:var(--dds-border-width-large);transition-property:all;transition-duration:var(--dds-transition-fast);transition-timing-function:var(--dds-easing-ease-in-out);display:flex;align-items:center;width:100%;padding:var(--dds-command-item-padding);border:0;border-radius:var(--dds-radius-small);background:var(--dds-command-item-background);color:var(--dds-command-item-color);font-family:inherit;font-size:var(--dds-font-size-base);font-weight:var(--dds-font-weight-medium);line-height:var(--dds-font-line-height-xlarge);text-align:left;text-decoration:none;cursor:pointer}.command-item:hover:not(.command-item--disabled){background-color:var(--dds-command-item-hover-background)}.command-item:focus:not(.command-item--disabled){outline-style:solid}.command-item.command-item--selected{background-color:var(--dds-command-item-selected-background);color:var(--dds-command-item-color)}.command-item.command-item-selectable--disabled,.command-item.command-item--disabled{opacity:.5;cursor:not-allowed}.command-item__content{display:flex;align-items:center;gap:var(--dds-spacing-100);width:100%}.command-item__content--selectable{display:grid;grid-template-columns:var(--dds-spacing-600) 1fr;align-items:center;justify-content:space-between;gap:var(--dds-spacing-100);width:100%;cursor:pointer}.command-item__label{display:flex;flex:1;align-items:center;gap:var(--dds-spacing-100)}.command-item-check{margin-left:var(--dds-spacing-200);color:var(--dds-text-primary-base)}";
|
|
2
2
|
export {
|
|
3
3
|
d as default
|
|
4
4
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var w = Object.getPrototypeOf;
|
|
2
2
|
var y = Reflect.get;
|
|
3
3
|
var m = (n, e, t) => y(w(n), t, e);
|
|
4
|
-
var
|
|
4
|
+
var d = (n, e, t) => new Promise((s, i) => {
|
|
5
5
|
var l = (o) => {
|
|
6
6
|
try {
|
|
7
7
|
u(t.next(o));
|
|
@@ -29,7 +29,7 @@ import { createKeyboardNavigationHandler as v } from "../../internal/keyboard-na
|
|
|
29
29
|
import f from "../popup/popup.component.js";
|
|
30
30
|
import $ from "./command.scss.js";
|
|
31
31
|
import { unsafeCSS as A } from "../../node_modules/@lit/reactive-element/css-tag.js";
|
|
32
|
-
var E = Object.defineProperty,
|
|
32
|
+
var E = Object.defineProperty, h = (n, e, t, s) => {
|
|
33
33
|
for (var i = void 0, l = n.length - 1, p; l >= 0; l--)
|
|
34
34
|
(p = n[l]) && (i = p(e, t, i) || i);
|
|
35
35
|
return i && E(e, t, i), i;
|
|
@@ -41,7 +41,7 @@ const a = class a extends f {
|
|
|
41
41
|
}, this.placement = "bottom-start", this.overflow = !0;
|
|
42
42
|
}
|
|
43
43
|
connectedCallback() {
|
|
44
|
-
return
|
|
44
|
+
return d(this, null, function* () {
|
|
45
45
|
yield m(a.prototype, this, "connectedCallback").call(this), this.addEventListener("keydown", this._handleKeyDown), this.handleClick = this.handleClick.bind(this), this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this);
|
|
46
46
|
});
|
|
47
47
|
}
|
|
@@ -57,13 +57,13 @@ const a = class a extends f {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
updated(e) {
|
|
60
|
-
return
|
|
60
|
+
return d(this, null, function* () {
|
|
61
61
|
yield m(a.prototype, this, "updated").call(this, e), e.has("opened") && this.opened && (yield this.updateComplete, this._initializeKeyboardNavigation());
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
_initializeKeyboardNavigation() {
|
|
65
65
|
this._keyboardNavigation = v(this, {
|
|
66
|
-
enabledSelector: "dap-ds-command-item:not([disabled])",
|
|
66
|
+
enabledSelector: "dap-ds-command-item:not([disabled]):not([hidden]):not(dap-ds-command-group[hidden] *)",
|
|
67
67
|
onItemClick: (e) => {
|
|
68
68
|
this._lastClickedItem = e;
|
|
69
69
|
}
|
|
@@ -106,13 +106,13 @@ const a = class a extends f {
|
|
|
106
106
|
this && !t.includes(this) && this.hideDropDown();
|
|
107
107
|
}
|
|
108
108
|
showDropDown() {
|
|
109
|
-
return
|
|
109
|
+
return d(this, null, function* () {
|
|
110
110
|
var e;
|
|
111
111
|
this.opened || (this.opened = !0, (e = this._trigger[0]) == null || e.setAttribute("aria-expanded", "true"), document.addEventListener("mousedown", this.handleDocumentMouseDown), yield this.updateComplete);
|
|
112
112
|
});
|
|
113
113
|
}
|
|
114
114
|
hideDropDown(e) {
|
|
115
|
-
return
|
|
115
|
+
return d(this, null, function* () {
|
|
116
116
|
var t, s;
|
|
117
117
|
this.opened && (this.opened = !1, (t = this._trigger[0]) == null || t.setAttribute("aria-expanded", "false"), document.removeEventListener("mousedown", this.handleDocumentMouseDown), (s = this._keyboardNavigation) == null || s.reset(), yield this.updateComplete, e != null && e.skipFocus || this.focus());
|
|
118
118
|
});
|
|
@@ -174,19 +174,19 @@ a.tagName = "dap-ds-command", a.dependencies = {
|
|
|
174
174
|
"dap-ds-popup": f
|
|
175
175
|
}, a.styles = A($);
|
|
176
176
|
let r = a;
|
|
177
|
-
|
|
177
|
+
h([
|
|
178
178
|
C({ slot: "trigger" })
|
|
179
179
|
], r.prototype, "_trigger");
|
|
180
|
-
|
|
180
|
+
h([
|
|
181
181
|
g({ type: String })
|
|
182
182
|
], r.prototype, "value");
|
|
183
|
-
|
|
183
|
+
h([
|
|
184
184
|
g({ type: Boolean })
|
|
185
185
|
], r.prototype, "fullWidth");
|
|
186
|
-
|
|
186
|
+
h([
|
|
187
187
|
g({ type: String, attribute: "aria-labelledby" })
|
|
188
188
|
], r.prototype, "ariaLabelledBy");
|
|
189
|
-
|
|
189
|
+
h([
|
|
190
190
|
_()
|
|
191
191
|
], r.prototype, "_lastClickedItem");
|
|
192
192
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.component.js","sources":["../../../src/components/command/command.component.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { html } from 'lit/static-html.js'\n\nimport { createKeyboardNavigationHandler } from '../../internal/keyboard-navigation.js'\nimport DapDSPopup from '../popup/popup.component.js'\nimport styles from './command.scss?inline'\n\n/**\n * `dap-ds-command`\n * @summary A command is a component that displays a list of commands.\n * @element dap-ds-command\n * @title - Command\n *\n * @event {{ value: string }} dds-change - Fired when the command value changes.\n *\n * @slot trigger - The trigger element for the command dropdown.\n * @slot - The command items.\n */\nexport default class DapDSCommand extends DapDSPopup {\n static tagName = 'dap-ds-command'\n\n static dependencies = {\n 'dap-ds-popup': DapDSPopup,\n }\n\n constructor() {\n super()\n this.placement = 'bottom-start'\n this.overflow = true\n }\n\n @queryAssignedElements({ slot: 'trigger' })\n private readonly _trigger!: HTMLElement[]\n\n static readonly styles = unsafeCSS(styles)\n\n /**\n * The value of the command.\n */\n @property({ type: String })\n value: string | null = null\n\n /** Whether the command popup should take full width of the screen. */\n @property({ type: Boolean }) fullWidth: boolean = false\n\n /** ID of element that labels the command dropdown. */\n @property({ type: String, attribute: 'aria-labelledby' })\n ariaLabelledBy?: string\n\n @state()\n private _lastClickedItem: HTMLElement | null = null\n\n private _keyboardNavigation: ReturnType<\n typeof createKeyboardNavigationHandler\n > | null = null\n\n async connectedCallback() {\n await super.connectedCallback()\n this.addEventListener('keydown', this._handleKeyDown)\n // Bind methods to maintain proper context\n this.handleClick = this.handleClick.bind(this)\n this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('keydown', this._handleKeyDown)\n // Ensure document listener is cleaned up\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n }\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties as Map<string, unknown>)\n\n if (this.value) {\n const item = this.querySelector(\n `dap-ds-command-item[value=\"${this.value}\"]`,\n )\n if (item) {\n this._lastClickedItem = item as HTMLElement\n this._lastClickedItem.focus()\n }\n }\n }\n\n async updated(changedProperties: Map<string, unknown>) {\n await super.updated(changedProperties)\n\n if (changedProperties.has('opened') && this.opened) {\n // Initialize keyboard navigation when dropdown opens\n await this.updateComplete\n this._initializeKeyboardNavigation()\n }\n }\n\n private _initializeKeyboardNavigation() {\n this._keyboardNavigation = createKeyboardNavigationHandler(this, {\n enabledSelector: 'dap-ds-command-item:not([disabled])',\n onItemClick: (item: HTMLElement) => {\n this._lastClickedItem = item\n },\n })\n\n // Initialize focus after next update\n this.updateComplete.then(() => {\n this._keyboardNavigation?.initializeFocus(\n this._lastClickedItem || undefined,\n )\n })\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n case 'Enter':\n case ' ':\n if (!this.opened) {\n if (\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'Enter' ||\n event.key === ' '\n ) {\n event.preventDefault()\n this.showDropDown()\n }\n return\n }\n\n if (this._keyboardNavigation?.handleKeyDown(event)) {\n // Key was handled by navigation manager\n if (event.key === 'Enter' || event.key === ' ') {\n this._handleFocusOut()\n }\n }\n break\n\n case 'Escape':\n event.preventDefault()\n this._handleFocusOut()\n break\n }\n }\n\n private _handleMenuItemClick(event: CustomEvent) {\n const { value, closeOnSelect } = event.detail\n this.emit('dds-change', { value })\n if (closeOnSelect === 'true') {\n this._lastClickedItem = event.target as HTMLElement\n this._handleFocusOut()\n }\n }\n\n private handleClick(event: MouseEvent) {\n // Prevent the default action so that when the command is nested inside an\n // interactive ancestor (e.g. a card rendered as an `<a href>`), toggling\n // the menu does not also activate that ancestor and navigate away.\n // `stopPropagation` alone is not enough: native anchor activation is a\n // default action, not listener propagation.\n event.preventDefault()\n event.stopPropagation()\n this.opened ? this.hideDropDown() : this.showDropDown()\n }\n\n private handleDocumentMouseDown(event: MouseEvent) {\n const path = event.composedPath()\n if (this && !path.includes(this)) {\n this.hideDropDown()\n }\n }\n\n async showDropDown() {\n if (this.opened) {\n return\n }\n\n this.opened = true\n this._trigger[0]?.setAttribute('aria-expanded', 'true')\n\n document.addEventListener('mousedown', this.handleDocumentMouseDown)\n\n await this.updateComplete\n }\n\n async hideDropDown(options?: { skipFocus?: boolean }) {\n if (!this.opened) {\n return\n }\n\n this.opened = false\n this._trigger[0]?.setAttribute('aria-expanded', 'false')\n\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n\n // Reset keyboard navigation state\n this._keyboardNavigation?.reset()\n\n await this.updateComplete\n\n if (!options?.skipFocus) {\n this.focus()\n }\n }\n\n private _handleFocusOut() {\n this.hideDropDown()\n this.focus()\n }\n\n private _handlePopupAutoClose = () => {\n this.hideDropDown({ skipFocus: true })\n }\n\n public focus() {\n if (this._trigger && this._trigger.length > 0) {\n const triggerElement = this._trigger[0]\n const rect = triggerElement.getBoundingClientRect()\n const isFullyInViewport =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n\n if (isFullyInViewport) {\n triggerElement.focus({ preventScroll: true })\n }\n }\n }\n\n private _handleTriggerChange() {\n if (this._trigger && this._trigger.length > 0) {\n this._trigger[0].setAttribute('aria-controls', 'popup')\n this._trigger[0].setAttribute(\n 'aria-expanded',\n this.opened ? 'true' : 'false',\n )\n }\n }\n\n private _handleDefaultSlotChange() {\n this._keyboardNavigation?.invalidateCache()\n }\n\n render() {\n return html`\n <dap-ds-popup\n part=\"popup-base\"\n id=\"popup\"\n role=\"menu\"\n aria-label=${this.ariaLabel || 'Command menu'}\n aria-labelledby=${this.ariaLabelledBy || nothing}\n aria-orientation=\"vertical\"\n ?opened=${this.opened}\n exportparts=\"popup\"\n class=${clsx('command')}\n placement=${this.placement}\n ?disabled=${this.disabled}\n @click=${this.handleClick}\n maxHeight=${this.maxHeight}\n ?overflow=${this.overflow}\n offset=${this.offset}\n ?sync=${this.sync}\n ?hasArrow=${this.hasArrow}\n ?fullWidth=${this.fullWidth}\n ?disableViewportAutoClose=${this.disableViewportAutoClose}\n floatingStrategy=${this.floatingStrategy}\n @dds-close=${this._handlePopupAutoClose}\n @dds-command-item-click=${this._handleMenuItemClick}>\n <slot\n name=\"trigger\"\n slot=\"trigger\"\n @slotchange=${this._handleTriggerChange}></slot>\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n </dap-ds-popup>\n `\n }\n}\n"],"names":["_DapDSCommand","DapDSPopup","__async","__superGet","_changedProperties","item","changedProperties","createKeyboardNavigationHandler","_a","event","value","closeOnSelect","path","options","_b","triggerElement","rect","html","nothing","clsx","unsafeCSS","styles","DapDSCommand","__decorateClass","queryAssignedElements","property","state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command.component.js","sources":["../../../src/components/command/command.component.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { html } from 'lit/static-html.js'\n\nimport { createKeyboardNavigationHandler } from '../../internal/keyboard-navigation.js'\nimport DapDSPopup from '../popup/popup.component.js'\nimport styles from './command.scss?inline'\n\n/**\n * `dap-ds-command`\n * @summary A command is a component that displays a list of commands.\n * @element dap-ds-command\n * @title - Command\n *\n * @event {{ value: string }} dds-change - Fired when the command value changes.\n *\n * @slot trigger - The trigger element for the command dropdown.\n * @slot - The command items.\n */\nexport default class DapDSCommand extends DapDSPopup {\n static tagName = 'dap-ds-command'\n\n static dependencies = {\n 'dap-ds-popup': DapDSPopup,\n }\n\n constructor() {\n super()\n this.placement = 'bottom-start'\n this.overflow = true\n }\n\n @queryAssignedElements({ slot: 'trigger' })\n private readonly _trigger!: HTMLElement[]\n\n static readonly styles = unsafeCSS(styles)\n\n /**\n * The value of the command.\n */\n @property({ type: String })\n value: string | null = null\n\n /** Whether the command popup should take full width of the screen. */\n @property({ type: Boolean }) fullWidth: boolean = false\n\n /** ID of element that labels the command dropdown. */\n @property({ type: String, attribute: 'aria-labelledby' })\n ariaLabelledBy?: string\n\n @state()\n private _lastClickedItem: HTMLElement | null = null\n\n private _keyboardNavigation: ReturnType<\n typeof createKeyboardNavigationHandler\n > | null = null\n\n async connectedCallback() {\n await super.connectedCallback()\n this.addEventListener('keydown', this._handleKeyDown)\n // Bind methods to maintain proper context\n this.handleClick = this.handleClick.bind(this)\n this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('keydown', this._handleKeyDown)\n // Ensure document listener is cleaned up\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n }\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties as Map<string, unknown>)\n\n if (this.value) {\n const item = this.querySelector(\n `dap-ds-command-item[value=\"${this.value}\"]`,\n )\n if (item) {\n this._lastClickedItem = item as HTMLElement\n this._lastClickedItem.focus()\n }\n }\n }\n\n async updated(changedProperties: Map<string, unknown>) {\n await super.updated(changedProperties)\n\n if (changedProperties.has('opened') && this.opened) {\n // Initialize keyboard navigation when dropdown opens\n await this.updateComplete\n this._initializeKeyboardNavigation()\n }\n }\n\n private _initializeKeyboardNavigation() {\n this._keyboardNavigation = createKeyboardNavigationHandler(this, {\n enabledSelector:\n 'dap-ds-command-item:not([disabled]):not([hidden]):not(dap-ds-command-group[hidden] *)',\n onItemClick: (item: HTMLElement) => {\n this._lastClickedItem = item\n },\n })\n\n // Initialize focus after next update\n this.updateComplete.then(() => {\n this._keyboardNavigation?.initializeFocus(\n this._lastClickedItem || undefined,\n )\n })\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n case 'Enter':\n case ' ':\n if (!this.opened) {\n if (\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'Enter' ||\n event.key === ' '\n ) {\n event.preventDefault()\n this.showDropDown()\n }\n return\n }\n\n if (this._keyboardNavigation?.handleKeyDown(event)) {\n // Key was handled by navigation manager\n if (event.key === 'Enter' || event.key === ' ') {\n this._handleFocusOut()\n }\n }\n break\n\n case 'Escape':\n event.preventDefault()\n this._handleFocusOut()\n break\n }\n }\n\n private _handleMenuItemClick(event: CustomEvent) {\n const { value, closeOnSelect } = event.detail\n this.emit('dds-change', { value })\n if (closeOnSelect === 'true') {\n this._lastClickedItem = event.target as HTMLElement\n this._handleFocusOut()\n }\n }\n\n private handleClick(event: MouseEvent) {\n // Prevent the default action so that when the command is nested inside an\n // interactive ancestor (e.g. a card rendered as an `<a href>`), toggling\n // the menu does not also activate that ancestor and navigate away.\n // `stopPropagation` alone is not enough: native anchor activation is a\n // default action, not listener propagation.\n event.preventDefault()\n event.stopPropagation()\n this.opened ? this.hideDropDown() : this.showDropDown()\n }\n\n private handleDocumentMouseDown(event: MouseEvent) {\n const path = event.composedPath()\n if (this && !path.includes(this)) {\n this.hideDropDown()\n }\n }\n\n async showDropDown() {\n if (this.opened) {\n return\n }\n\n this.opened = true\n this._trigger[0]?.setAttribute('aria-expanded', 'true')\n\n document.addEventListener('mousedown', this.handleDocumentMouseDown)\n\n await this.updateComplete\n }\n\n async hideDropDown(options?: { skipFocus?: boolean }) {\n if (!this.opened) {\n return\n }\n\n this.opened = false\n this._trigger[0]?.setAttribute('aria-expanded', 'false')\n\n document.removeEventListener('mousedown', this.handleDocumentMouseDown)\n\n // Reset keyboard navigation state\n this._keyboardNavigation?.reset()\n\n await this.updateComplete\n\n if (!options?.skipFocus) {\n this.focus()\n }\n }\n\n private _handleFocusOut() {\n this.hideDropDown()\n this.focus()\n }\n\n private _handlePopupAutoClose = () => {\n this.hideDropDown({ skipFocus: true })\n }\n\n public focus() {\n if (this._trigger && this._trigger.length > 0) {\n const triggerElement = this._trigger[0]\n const rect = triggerElement.getBoundingClientRect()\n const isFullyInViewport =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n\n if (isFullyInViewport) {\n triggerElement.focus({ preventScroll: true })\n }\n }\n }\n\n private _handleTriggerChange() {\n if (this._trigger && this._trigger.length > 0) {\n this._trigger[0].setAttribute('aria-controls', 'popup')\n this._trigger[0].setAttribute(\n 'aria-expanded',\n this.opened ? 'true' : 'false',\n )\n }\n }\n\n private _handleDefaultSlotChange() {\n this._keyboardNavigation?.invalidateCache()\n }\n\n render() {\n return html`\n <dap-ds-popup\n part=\"popup-base\"\n id=\"popup\"\n role=\"menu\"\n aria-label=${this.ariaLabel || 'Command menu'}\n aria-labelledby=${this.ariaLabelledBy || nothing}\n aria-orientation=\"vertical\"\n ?opened=${this.opened}\n exportparts=\"popup\"\n class=${clsx('command')}\n placement=${this.placement}\n ?disabled=${this.disabled}\n @click=${this.handleClick}\n maxHeight=${this.maxHeight}\n ?overflow=${this.overflow}\n offset=${this.offset}\n ?sync=${this.sync}\n ?hasArrow=${this.hasArrow}\n ?fullWidth=${this.fullWidth}\n ?disableViewportAutoClose=${this.disableViewportAutoClose}\n floatingStrategy=${this.floatingStrategy}\n @dds-close=${this._handlePopupAutoClose}\n @dds-command-item-click=${this._handleMenuItemClick}>\n <slot\n name=\"trigger\"\n slot=\"trigger\"\n @slotchange=${this._handleTriggerChange}></slot>\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n </dap-ds-popup>\n `\n }\n}\n"],"names":["_DapDSCommand","DapDSPopup","__async","__superGet","_changedProperties","item","changedProperties","createKeyboardNavigationHandler","_a","event","value","closeOnSelect","path","options","_b","triggerElement","rect","html","nothing","clsx","unsafeCSS","styles","DapDSCommand","__decorateClass","queryAssignedElements","property","state"],"mappings":"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"}
|
|
@@ -257,6 +257,8 @@ export default class DapDSDataTable<T> extends DdsElement {
|
|
|
257
257
|
private renderCell;
|
|
258
258
|
private handleRowClick;
|
|
259
259
|
private handleRowKeydown;
|
|
260
|
+
private columnIdOf;
|
|
261
|
+
private getTableMinWidth;
|
|
260
262
|
private readonly renderColgroup;
|
|
261
263
|
private readonly renderHeader;
|
|
262
264
|
private readonly renderSkeletonRows;
|