@ni/nimble-components 31.1.0 → 31.1.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/all-components-bundle.js +16 -19
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +3023 -3026
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/combobox/testing/combobox.pageobject.js +3 -3
- package/dist/esm/combobox/testing/combobox.pageobject.js.map +1 -1
- package/dist/esm/list-option/index.js +2 -4
- package/dist/esm/list-option/index.js.map +1 -1
- package/dist/esm/list-option-group/index.js +2 -5
- package/dist/esm/list-option-group/index.js.map +1 -1
- package/dist/esm/menu-button/testing/menu-button.pageobject.js +2 -2
- package/dist/esm/menu-button/testing/menu-button.pageobject.js.map +1 -1
- package/dist/esm/select/index.js +2 -5
- package/dist/esm/select/index.js.map +1 -1
- package/dist/esm/table-column/base/index.js +2 -4
- package/dist/esm/table-column/base/index.js.map +1 -1
- package/dist/esm/utilities/models/slot-text-content.d.ts +4 -0
- package/dist/esm/utilities/models/slot-text-content.js +11 -0
- package/dist/esm/utilities/models/slot-text-content.js.map +1 -0
- package/dist/esm/utilities/testing/component.d.ts +1 -10
- package/dist/esm/utilities/testing/component.js +7 -23
- package/dist/esm/utilities/testing/component.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { keyEnter, keyArrowDown, keyArrowUp } from '@microsoft/fast-web-utilities';
|
|
2
2
|
import { listOptionTag } from '../../list-option';
|
|
3
3
|
import { waitForUpdatesAsync } from '../../testing/async-helpers';
|
|
4
|
-
import {
|
|
4
|
+
import { waitForEvent, waitAnimationFrame } from '../../utilities/testing/component';
|
|
5
5
|
/**
|
|
6
6
|
* Page object for the `nimble-combobox` component to provide consistent ways
|
|
7
7
|
* of querying and interacting with the component during tests.
|
|
@@ -9,7 +9,7 @@ import { createEventListener, waitAnimationFrame } from '../../utilities/testing
|
|
|
9
9
|
export class ComboboxPageObject {
|
|
10
10
|
constructor(comboboxElement) {
|
|
11
11
|
this.comboboxElement = comboboxElement;
|
|
12
|
-
this.regionLoadedListener =
|
|
12
|
+
this.regionLoadedListener = waitForEvent(this.comboboxElement, 'loaded');
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Gets the selectable options in the drop-down. Does not include options that are disabled or filtered out.
|
|
@@ -166,7 +166,7 @@ export class ComboboxPageObject {
|
|
|
166
166
|
return (this.comboboxElement.shadowRoot?.querySelector('.no-results-label') !== null);
|
|
167
167
|
}
|
|
168
168
|
async waitForAnchoredRegionLoaded() {
|
|
169
|
-
await this.regionLoadedListener
|
|
169
|
+
await this.regionLoadedListener;
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
//# sourceMappingURL=combobox.pageobject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.pageobject.js","sourceRoot":"","sources":["../../../../src/combobox/testing/combobox.pageobject.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EACR,YAAY,EACZ,UAAU,EACb,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACH,
|
|
1
|
+
{"version":3,"file":"combobox.pageobject.js","sourceRoot":"","sources":["../../../../src/combobox/testing/combobox.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n keyEnter,\n keyArrowDown,\n keyArrowUp\n} from '@microsoft/fast-web-utilities';\nimport type { Combobox } from '..';\nimport { listOptionTag } from '../../list-option';\nimport { waitForUpdatesAsync } from '../../testing/async-helpers';\nimport {\n waitForEvent,\n waitAnimationFrame\n} from '../../utilities/testing/component';\n\n/**\n * Page object for the `nimble-combobox` component to provide consistent ways\n * of querying and interacting with the component during tests.\n */\nexport class ComboboxPageObject {\n private readonly regionLoadedListener = waitForEvent(\n this.comboboxElement,\n 'loaded'\n );\n\n public constructor(protected readonly comboboxElement: Combobox) {}\n\n /**\n * Gets the selectable options in the drop-down. Does not include options that are disabled or filtered out.\n */\n public getFilteredOptions(): string[] {\n return this.comboboxElement.filteredOptions.map(x => x.text);\n }\n\n /**\n * Sets the input text and commits the value by pressing Enter. Will emit a 'change' event.\n */\n public async commitValue(text: string): Promise<void> {\n await this.waitForAnchoredRegionLoaded();\n this.setInputText(text);\n this.pressEnterKey();\n }\n\n /**\n * @internal\n *\n * The Selection API currently isn't supported properly or consistently in shadow DOM,\n * so unfortunately our delete API has to be passed the post-deletion text.\n */\n public setInputText(text: string, asDelete = false): void {\n this.comboboxElement.control.value = text;\n const inputEvent = new InputEvent('input', {\n data: text,\n inputType: asDelete ? 'deleteContentForward' : 'insertText'\n });\n this.comboboxElement.control.dispatchEvent(inputEvent);\n }\n\n /**\n * @internal\n *\n * Either opens or closes the dropdown depending on its current state\n */\n public clickCombobox(): void {\n this.comboboxElement.click();\n }\n\n /**\n * @internal\n */\n public async clickAndWaitForOpen(): Promise<void> {\n this.clickCombobox();\n await this.waitForAnchoredRegionLoaded();\n await waitForUpdatesAsync();\n await waitAnimationFrame(); // necessary because scrolling is queued with requestAnimationFrame\n }\n\n /**\n * @internal\n *\n * Either opens or closes the dropdown depending on its current state\n */\n public clickDropdownButton(): void {\n this.comboboxElement.dropdownButton!.control.click();\n }\n\n /**\n * @internal\n */\n public async clickDropdownButtonAndWaitForOpen(): Promise<void> {\n this.clickDropdownButton();\n await this.waitForAnchoredRegionLoaded();\n await waitAnimationFrame(); // necessary because scrolling is queued with requestAnimationFrame\n }\n\n /**\n * @internal\n */\n public isDropdownButtonChecked(): boolean {\n return this.comboboxElement.dropdownButton!.checked;\n }\n\n /**\n * @internal\n */\n public isDropdownButtonDisabled(): boolean {\n return this.comboboxElement.dropdownButton!.disabled;\n }\n\n /**\n * @internal\n *\n * Either opens or closes the dropdown depending on its current state\n */\n public clickInput(): void {\n this.comboboxElement.control.click();\n }\n\n /**\n * @internal\n */\n public getInputTitle(): string | null {\n return this.comboboxElement.control.getAttribute('title');\n }\n\n /**\n * @internal\n */\n public getInputAriaLabel(): string | null {\n return this.comboboxElement.control.getAttribute('aria-label');\n }\n\n /**\n * @internal\n */\n public async mouseoverInput(): Promise<void> {\n this.comboboxElement.control.dispatchEvent(new MouseEvent('mouseover'));\n await waitForUpdatesAsync();\n }\n\n /**\n * @internal\n */\n public async mouseoutInput(): Promise<void> {\n this.comboboxElement.control.dispatchEvent(new MouseEvent('mouseout'));\n await waitForUpdatesAsync();\n }\n\n /**\n * @internal\n */\n public async prependOption(value: string, label: string): Promise<void> {\n this.comboboxElement.insertAdjacentHTML(\n 'afterbegin',\n `<${listOptionTag} value=\"${value}\">${label}</${listOptionTag}>`\n );\n await waitForUpdatesAsync();\n }\n\n /**\n * @internal\n */\n public async clickAway(): Promise<void> {\n this.comboboxElement.dispatchEvent(new Event('focusout'));\n await waitForUpdatesAsync();\n }\n\n /**\n * @internal\n */\n public pressEnterKey(): void {\n this.comboboxElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyEnter })\n );\n }\n\n /**\n * @internal\n */\n public pressArrowDownKey(): void {\n this.comboboxElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowDown })\n );\n }\n\n /**\n * @internal\n */\n public pressArrowUpKey(): void {\n this.comboboxElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowUp })\n );\n }\n\n /**\n * @internal\n */\n public hideAllOptions(): void {\n this.comboboxElement.options.forEach(o => {\n o.hidden = true;\n });\n this.comboboxElement.filterOptions();\n }\n\n /**\n * @internal\n */\n public isNoResultsLabelVisible(): boolean {\n return (\n this.comboboxElement.shadowRoot?.querySelector(\n '.no-results-label'\n ) !== null\n );\n }\n\n private async waitForAnchoredRegionLoaded(): Promise<void> {\n await this.regionLoadedListener;\n }\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import { DesignSystem, ListboxOption as FoundationListboxOption } from '@microso
|
|
|
3
3
|
import { observable, attr } from '@microsoft/fast-element';
|
|
4
4
|
import { styles } from './styles';
|
|
5
5
|
import { template } from './template';
|
|
6
|
+
import { slotTextContent } from '../utilities/models/slot-text-content';
|
|
6
7
|
/**
|
|
7
8
|
* A nimble-styled HTML listbox option
|
|
8
9
|
*/
|
|
@@ -40,10 +41,7 @@ export class ListOption extends FoundationListboxOption {
|
|
|
40
41
|
}
|
|
41
42
|
/** @internal */
|
|
42
43
|
get elementTextContent() {
|
|
43
|
-
return this.contentSlot
|
|
44
|
-
.assignedNodes()
|
|
45
|
-
.map(node => node.textContent?.trim())
|
|
46
|
-
.join(' ');
|
|
44
|
+
return slotTextContent(this.contentSlot);
|
|
47
45
|
}
|
|
48
46
|
connectedCallback() {
|
|
49
47
|
super.connectedCallback();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/list-option/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,YAAY,EACZ,aAAa,IAAI,uBAAuB,EAC3C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/list-option/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,YAAY,EACZ,aAAa,IAAI,uBAAuB,EAC3C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAQxE;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,uBAAuB;IAAvD;;QAII;;;;;;;WAOG;QAEa,WAAM,GAAG,KAAK,CAAC;QAE/B;;;;;;WAMG;QAEI,mBAAc,GAAG,KAAK,CAAC;QAE9B;;;;;;;WAOG;QAEI,iBAAY,GAAG,KAAK,CAAC;QAE5B,gBAAgB;QAET,gBAAW,GAAG,KAAK,CAAC;IAoC/B,CAAC;IAlCG,gBAAgB;IAChB,IAAW,kBAAkB;QACzB,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAEe,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEO,kBAAkB;QACtB,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAEhC,OAAO,MAAM,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,OAAO,MAAM,CAAC;YAClB,CAAC;YAED,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QAClC,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,iBAAiB,CACrB,MAA0B;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,OAAQ,MAA0B,CAAC,cAAc,KAAK,UAAU,CAAC;IAC5E,CAAC;CACJ;AA7DmB;IADf,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;0CACK;AAUxB;IADN,IAAI,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDAC1B;AAWvB;IADN,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gDAC1B;AAIrB;IADN,UAAU;+CACgB;AAsC/B,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;IACxC,QAAQ,EAAE,aAAa;IACvB,SAAS,EAAE,uBAAuB;IAClC,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAAC","sourcesContent":["import {\n DesignSystem,\n ListboxOption as FoundationListboxOption\n} from '@microsoft/fast-foundation';\nimport { observable, attr } from '@microsoft/fast-element';\nimport { styles } from './styles';\nimport { template } from './template';\nimport type { ListOptionOwner } from '../patterns/dropdown/types';\nimport { slotTextContent } from '../utilities/models/slot-text-content';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-list-option': ListOption;\n }\n}\n\n/**\n * A nimble-styled HTML listbox option\n */\nexport class ListOption extends FoundationListboxOption {\n /** @internal */\n public contentSlot!: HTMLSlotElement;\n\n /**\n * The hidden state of the element.\n *\n * @public\n * @defaultValue - false\n * @remarks\n * HTML Attribute: hidden\n */\n @attr({ mode: 'boolean' })\n public override hidden = false;\n\n /**\n * @internal\n * This attribute is required to allow use-cases that offer dynamic filtering\n * (like the Select) to visually hide options that are filtered out, but still\n * allow users to use the native 'hidden' attribute without it being affected\n * by the filtering process.\n */\n @attr({ attribute: 'visually-hidden', mode: 'boolean' })\n public visuallyHidden = false;\n\n /**\n * @internal\n * This attribute is used to control the visual selected state of an option. This\n * is handled independently of the public 'selected' attribute, as 'selected' is\n * representative of the current value of the container control. However, while\n * a dropdown is open users can navigate through the options (requiring visual\n * updates) without changing the value of the container control.\n */\n @attr({ attribute: 'active-option', mode: 'boolean' })\n public activeOption = false;\n\n /** @internal */\n @observable\n public hasOverflow = false;\n\n /** @internal */\n public get elementTextContent(): string {\n return slotTextContent(this.contentSlot);\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n const owner = this.getListOptionOwner();\n owner?.registerOption(this);\n }\n\n private getListOptionOwner(): ListOptionOwner | undefined {\n let parent = this.parentElement;\n\n while (parent) {\n if (this.isListOptionOwner(parent)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return undefined;\n }\n\n private isListOptionOwner(\n parent: HTMLElement | null\n ): parent is ListOptionOwner {\n if (!parent) {\n return false;\n }\n\n return typeof (parent as ListOptionOwner).registerOption === 'function';\n }\n}\n\nconst nimbleListOption = ListOption.compose({\n baseName: 'list-option',\n baseClass: FoundationListboxOption,\n template,\n styles\n});\n\nDesignSystem.getOrCreate().withPrefix('nimble').register(nimbleListOption());\nexport const listOptionTag = 'nimble-list-option';\n"]}
|
|
@@ -4,6 +4,7 @@ import { observable, attr, volatile, Observable } from '@microsoft/fast-element'
|
|
|
4
4
|
import { styles } from './styles';
|
|
5
5
|
import { template } from './template';
|
|
6
6
|
import { ListOption } from '../list-option';
|
|
7
|
+
import { slotTextContent } from '../utilities/models/slot-text-content';
|
|
7
8
|
/**
|
|
8
9
|
* A nimble-styled HTML listbox option group
|
|
9
10
|
*/
|
|
@@ -47,11 +48,7 @@ export class ListOptionGroup extends FoundationElement {
|
|
|
47
48
|
if (!this.$fastController.isConnected) {
|
|
48
49
|
return '';
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
return nodes
|
|
52
|
-
.filter(node => node.textContent?.trim() !== '')
|
|
53
|
-
.map(node => node.textContent?.trim())
|
|
54
|
-
.join(' ');
|
|
51
|
+
return slotTextContent(this.labelSlot);
|
|
55
52
|
}
|
|
56
53
|
/**
|
|
57
54
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/list-option-group/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EACH,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,UAAU,EACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/list-option-group/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { DesignSystem, FoundationElement } from '@microsoft/fast-foundation';\nimport {\n observable,\n attr,\n volatile,\n Observable\n} from '@microsoft/fast-element';\nimport { styles } from './styles';\nimport { template } from './template';\nimport { ListOption } from '../list-option';\nimport { slotTextContent } from '../utilities/models/slot-text-content';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-list-option-group': ListOptionGroup;\n }\n}\n\n/**\n * A nimble-styled HTML listbox option group\n */\nexport class ListOptionGroup extends FoundationElement {\n /**\n * The label for the group.\n *\n * @public\n * @remarks\n * If a label is also provided via slotted content, the label attribute\n * will have precedence.\n */\n @attr\n public label?: string;\n\n /**\n * The hidden state of the element.\n *\n * @public\n * @defaultValue - false\n * @remarks\n * HTML Attribute: hidden\n */\n @attr({ mode: 'boolean' })\n public override hidden = false;\n\n /**\n * @internal\n * This attribute is required to allow use-cases that offer dynamic filtering\n * (like the Select) to visually hide groups that are filtered out, but still\n * allow users to use the native 'hidden' attribute without it being affected\n * by the filtering process.\n */\n @attr({ attribute: 'visually-hidden', mode: 'boolean' })\n public visuallyHidden = false;\n\n /**\n * @internal\n */\n @attr({ attribute: 'top-separator-visible', mode: 'boolean' })\n public topSeparatorVisible = false;\n\n /**\n * @internal\n */\n @attr({ attribute: 'bottom-separator-visible', mode: 'boolean' })\n public bottomSeparatorVisible = false;\n\n /** @internal */\n @observable\n public hasOverflow = false;\n\n /** @internal */\n public labelSlot!: HTMLSlotElement;\n\n /** @internal */\n @observable\n public listOptions!: ListOption[];\n\n /** @internal */\n @volatile\n public get labelContent(): string {\n if (this.label) {\n return this.label;\n }\n\n if (!this.$fastController.isConnected) {\n return '';\n }\n\n return slotTextContent(this.labelSlot);\n }\n\n private readonly hiddenOptions: Set<ListOption> = new Set();\n\n /**\n * @internal\n */\n public clickHandler(e: MouseEvent): void {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n /**\n * @internal\n */\n public handleChange(source: unknown, propertyName: string): void {\n if (\n source instanceof ListOption\n && (propertyName === 'hidden' || propertyName === 'visuallyHidden')\n ) {\n if (source.hidden || source.visuallyHidden) {\n this.hiddenOptions.add(source);\n } else {\n this.hiddenOptions.delete(source);\n }\n\n this.visuallyHidden = this.hiddenOptions.size === this.listOptions.length;\n }\n }\n\n private listOptionsChanged(\n prev: ListOption[] | undefined,\n next: ListOption[]\n ): void {\n this.hiddenOptions.clear();\n next.filter(o => o.hidden || o.visuallyHidden).forEach(o => this.hiddenOptions.add(o));\n prev?.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.unsubscribe(this, 'hidden');\n notifier.unsubscribe(this, 'visuallyHidden');\n });\n\n let allOptionsHidden = true;\n next?.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.subscribe(this, 'hidden');\n notifier.subscribe(this, 'visuallyHidden');\n allOptionsHidden = allOptionsHidden && (o.hidden || o.visuallyHidden);\n });\n\n this.visuallyHidden = next.length === 0 || allOptionsHidden;\n }\n}\n\nconst nimbleListOptionGroup = ListOptionGroup.compose({\n baseName: 'list-option-group',\n baseClass: FoundationElement,\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleListOptionGroup());\nexport const listOptionGroupTag = 'nimble-list-option-group';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { keyArrowDown, keyArrowUp, keyEnter, keyEscape, keySpace } from '@microsoft/fast-web-utilities';
|
|
2
|
-
import {
|
|
2
|
+
import { waitForEvent } from '../../utilities/testing/component';
|
|
3
3
|
/**
|
|
4
4
|
* Page object for `nimble-menu-button` component to provide consistent ways
|
|
5
5
|
* of querying and interacting with the component during tests.
|
|
@@ -25,7 +25,7 @@ export class MenuButtonPageObject {
|
|
|
25
25
|
if (this.isOpen()) {
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
const toggleEventPromise =
|
|
28
|
+
const toggleEventPromise = waitForEvent(this.menuButtonElement, 'toggle');
|
|
29
29
|
this.clickMenuButton();
|
|
30
30
|
await toggleEventPromise;
|
|
31
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-button.pageobject.js","sourceRoot":"","sources":["../../../../src/menu-button/testing/menu-button.pageobject.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACX,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"menu-button.pageobject.js","sourceRoot":"","sources":["../../../../src/menu-button/testing/menu-button.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n keyArrowDown,\n keyArrowUp,\n keyEnter,\n keyEscape,\n keySpace\n} from '@microsoft/fast-web-utilities';\nimport type { MenuButton } from '..';\nimport { waitForEvent } from '../../utilities/testing/component';\n\n/**\n * Page object for `nimble-menu-button` component to provide consistent ways\n * of querying and interacting with the component during tests.\n *\n * This page object is intended to be used to interact with a `nimble-menu-button`,\n * not the menu slotted into the button or the menu items.\n */\nexport class MenuButtonPageObject {\n public constructor(protected readonly menuButtonElement: MenuButton) {}\n\n /**\n * @returns Whether or not the menu is open.\n */\n public isOpen(): boolean {\n return this.menuButtonElement.open;\n }\n\n /**\n * Opens the menu.\n * @returns A promise that resolves when the menu opens.\n */\n public async openMenu(): Promise<void> {\n if (this.isOpen()) {\n return;\n }\n\n const toggleEventPromise = waitForEvent(\n this.menuButtonElement,\n 'toggle'\n );\n this.clickMenuButton();\n await toggleEventPromise;\n }\n\n /**\n * Closes the menu by pressing Escape.\n * Throws an error if the menu is not open.\n */\n public closeMenuWithEscape(): void {\n if (!this.isOpen()) {\n throw new Error('Cannot close menu when it is not open');\n }\n\n const event = new KeyboardEvent('keydown', {\n key: keyEscape\n });\n this.menuButtonElement.region!.dispatchEvent(event);\n }\n\n /**\n * Gets the text in the menu button.\n * @returns The trimmed text that is slotted into the menu button.\n */\n public getLabelText(): string {\n return this.menuButtonElement.textContent?.trim() ?? '';\n }\n\n /**\n * @returns Whether or not the menu button is focused.\n */\n public isFocused(): boolean {\n return this.menuButtonElement.shadowRoot?.activeElement !== null;\n }\n\n /**\n * @internal\n * Focuses and clicks the menu button.\n */\n public clickMenuButton(): void {\n // Focus the menu button before calling click() because ordinarily a mouse click\n // would bring focus to the button, but calling click() directly does not.\n this.menuButtonElement.focus();\n this.menuButtonElement.toggleButton!.control.click();\n }\n\n /**\n * @internal\n * Presses the Enter key on the menu button.\n */\n public pressEnterKey(): void {\n // Focus the menu button before dispatching the event because a key event only makes sense on a focused element.\n this.menuButtonElement.focus();\n const event = new KeyboardEvent('keypress', {\n key: keyEnter\n });\n this.menuButtonElement.toggleButton!.control.dispatchEvent(event);\n }\n\n /**\n * @internal\n * Presses the Space key on the menu button.\n */\n public pressSpaceKey(): void {\n // Focus the menu button before dispatching the event because a key event only makes sense on a focused element.\n this.menuButtonElement.focus();\n const event = new KeyboardEvent('keypress', {\n key: keySpace\n });\n this.menuButtonElement.toggleButton!.control.dispatchEvent(event);\n }\n\n /**\n * @internal\n * Presses the Arrow Up key on the menu button.\n */\n public pressArrowUpKey(): void {\n // Focus the menu button before dispatching the event because a key event only makes sense on a focused element.\n this.menuButtonElement.focus();\n const event = new KeyboardEvent('keydown', {\n key: keyArrowUp\n });\n this.menuButtonElement.toggleButton!.dispatchEvent(event);\n }\n\n /**\n * @internal\n * Presses the Arrow Down key on the menu button.\n */\n public pressArrowDownKey(): void {\n // Focus the menu button before dispatching the event because a key event only makes sense on a focused element.\n this.menuButtonElement.focus();\n const event = new KeyboardEvent('keydown', {\n key: keyArrowDown\n });\n this.menuButtonElement.toggleButton!.dispatchEvent(event);\n }\n\n /**\n * @internal\n */\n public getTitle(): string {\n return this.menuButtonElement.title;\n }\n\n /**\n * @internal\n */\n public dispatchEvent(event: Event): void {\n this.menuButtonElement.dispatchEvent(event);\n }\n}\n"]}
|
package/dist/esm/select/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { isListOption, isListOptionGroup, template } from './template';
|
|
|
12
12
|
import { FilterMode } from './types';
|
|
13
13
|
import { diacriticInsensitiveStringNormalizer } from '../utilities/models/string-normalizers';
|
|
14
14
|
import { FormAssociatedSelect } from './models/select-form-associated';
|
|
15
|
+
import { slotTextContent } from '../utilities/models/slot-text-content';
|
|
15
16
|
const isOptionSelectable = (el) => {
|
|
16
17
|
return !el.visuallyHidden && !el.disabled && !el.hidden;
|
|
17
18
|
};
|
|
@@ -78,11 +79,7 @@ export class Select extends FormAssociatedSelect {
|
|
|
78
79
|
if (!this.$fastController.isConnected) {
|
|
79
80
|
return '';
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
return nodes
|
|
83
|
-
.filter(node => node.textContent?.trim() !== '')
|
|
84
|
-
.map(node => node.textContent?.trim())
|
|
85
|
-
.join(' ');
|
|
82
|
+
return slotTextContent(this.labelSlot);
|
|
86
83
|
}
|
|
87
84
|
/**
|
|
88
85
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/select/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Based on: https://github.com/microsoft/fast/blob/%40microsoft/fast-foundation_v2.49.5/packages/web-components/fast-foundation/src/select/select.ts\nimport {\n attr,\n html,\n observable,\n Observable,\n volatile\n} from '@microsoft/fast-element';\nimport {\n AnchoredRegion,\n DesignSystem,\n Select as FoundationSelect,\n ListboxOption,\n SelectOptions,\n SelectPosition,\n applyMixins,\n StartEnd,\n DelegatesARIASelect\n} from '@microsoft/fast-foundation';\nimport {\n findLastIndex,\n keyArrowDown,\n keyArrowUp,\n keyEnd,\n keyEnter,\n keyEscape,\n keyHome,\n keySpace,\n uniqueId\n} from '@microsoft/fast-web-utilities';\nimport { arrowExpanderDown16X16 } from '@ni/nimble-tokens/dist/icons/js';\nimport { styles } from './styles';\nimport {\n DropdownAppearance,\n ListOptionOwner\n} from '../patterns/dropdown/types';\nimport { errorTextTemplate } from '../patterns/error/template';\nimport type { ErrorPattern } from '../patterns/error/types';\nimport { iconExclamationMarkTag } from '../icons/exclamation-mark';\nimport { isListOption, isListOptionGroup, template } from './template';\nimport type { ListOption } from '../list-option';\nimport { FilterMode, SelectFilterInputEventDetail } from './types';\nimport { diacriticInsensitiveStringNormalizer } from '../utilities/models/string-normalizers';\nimport { FormAssociatedSelect } from './models/select-form-associated';\nimport type { ListOptionGroup } from '../list-option-group';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-select': Select;\n }\n}\n\n// Used in overrides of base class methods\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\ntype BooleanOrVoid = boolean | void;\n\nconst isOptionSelectable = (el: ListOption): boolean => {\n return !el.visuallyHidden && !el.disabled && !el.hidden;\n};\n\nconst isOptionPlaceholder = (el: ListboxOption): boolean => {\n return el.disabled && el.hidden;\n};\n\nconst isOptionOrGroupVisible = (el: ListOption | ListOptionGroup): boolean => {\n return !el.visuallyHidden && !el.hidden;\n};\n\n/**\n * A nimble-styled HTML select.\n */\nexport class Select\n extends FormAssociatedSelect\n implements ErrorPattern, ListOptionOwner {\n @attr\n public appearance: DropdownAppearance = DropdownAppearance.underline;\n\n /**\n * Reflects the placement for the listbox when the select is open.\n *\n * @public\n */\n @attr({ attribute: 'position' })\n public positionAttribute?: SelectPosition;\n\n /**\n * A message explaining why the value is invalid.\n *\n * @public\n * @remarks\n * HTML Attribute: error-text\n */\n @attr({ attribute: 'error-text' })\n public errorText: string | undefined;\n\n @attr({ attribute: 'error-visible', mode: 'boolean' })\n public errorVisible = false;\n\n @attr({ attribute: 'filter-mode' })\n public filterMode: FilterMode = FilterMode.none;\n\n @attr({ attribute: 'clearable', mode: 'boolean' })\n public clearable = false;\n\n @attr({ attribute: 'loading-visible', mode: 'boolean' })\n public loadingVisible = false;\n\n /**\n * @internal\n */\n @observable\n public displayPlaceholder = false;\n\n /**\n * @internal\n */\n @attr({ attribute: 'open', mode: 'boolean' })\n public open = false;\n\n /**\n * Holds the current state for the calculated position of the listbox.\n *\n * @public\n */\n @observable\n public position?: SelectPosition;\n\n /**\n * The ref to the internal `.control` element.\n *\n * @internal\n */\n @observable\n public control!: HTMLElement;\n\n /**\n * Reference to the internal listbox element.\n *\n * @internal\n */\n public listbox!: HTMLDivElement;\n\n /**\n * The unique id for the internal listbox element.\n *\n * @internal\n */\n public listboxId: string = uniqueId('listbox-');\n\n /**\n * @internal\n */\n @observable\n public scrollableRegion!: HTMLElement;\n\n /**\n * @internal\n */\n @observable\n public filterInput?: HTMLInputElement;\n\n /**\n * @internal\n */\n @observable\n public anchoredRegion!: AnchoredRegion;\n\n /** @internal */\n @observable\n public hasOverflow = false;\n\n /**\n * @internal\n */\n @observable\n public filteredOptions: ListboxOption[] = [];\n\n /**\n * @internal\n */\n @observable\n public filter = '';\n\n /**\n * The space available in the viewport for the listbox when opened.\n *\n * @internal\n */\n @observable\n public availableViewportHeight = 0;\n\n /**\n * The component is collapsible when in single-selection mode with no size attribute.\n *\n * @internal\n */\n @volatile\n public get collapsible(): boolean {\n return !(this.multiple || typeof this.size === 'number');\n }\n\n /** @internal */\n public labelSlot!: HTMLSlotElement;\n\n /** @internal */\n @volatile\n public get labelContent(): string {\n if (!this.$fastController.isConnected) {\n return '';\n }\n\n const nodes = this.labelSlot.assignedNodes();\n return nodes\n .filter(node => node.textContent?.trim() !== '')\n .map(node => node.textContent?.trim())\n .join(' ');\n }\n\n private _value = '';\n private forcedPosition = false;\n private openActiveIndex?: number;\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n this.forcedPosition = !!this.positionAttribute;\n if (this.open) {\n this.initializeOpenState();\n }\n }\n\n public override get value(): string {\n Observable.track(this, 'value');\n return this._value;\n }\n\n public override set value(next: string) {\n const prev = this._value;\n let newValue = next;\n\n if (this.options?.length) {\n const newValueIndex = this.options.findIndex(\n el => el.value === newValue\n );\n const prevSelectedValue = this.options[this.selectedIndex]?.value ?? null;\n const nextSelectedValue = this.options[newValueIndex]?.value ?? null;\n\n if (\n newValueIndex === -1\n || prevSelectedValue !== nextSelectedValue\n ) {\n newValue = '';\n this.selectedIndex = newValueIndex;\n }\n\n newValue = this.firstSelectedOption?.value ?? newValue;\n }\n\n if (prev !== newValue) {\n this._value = newValue;\n super.valueChanged(prev, newValue);\n Observable.notify(this, 'value');\n this.updateDisplayValue();\n }\n }\n\n /**\n * @internal\n */\n @volatile\n public get displayValue(): string {\n Observable.track(this, 'displayValue');\n return this.firstSelectedOption?.text ?? '';\n }\n\n /**\n * @internal\n */\n public anchoredRegionChanged(\n _prev: AnchoredRegion | undefined,\n _next: AnchoredRegion | undefined\n ): void {\n if (this.anchoredRegion && this.control) {\n this.anchoredRegion.anchorElement = this.control;\n }\n }\n\n /**\n * @internal\n */\n public controlChanged(\n _prev: HTMLElement | undefined,\n _next: HTMLElement | undefined\n ): void {\n if (this.anchoredRegion && this.control) {\n this.anchoredRegion.anchorElement = this.control;\n }\n }\n\n /**\n * @internal\n */\n public override slottedOptionsChanged(\n prev: Element[] | undefined,\n next: Element[] | undefined\n ): void {\n const value = this.value;\n this.options.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.unsubscribe(this, 'value');\n notifier.unsubscribe(this, 'hidden');\n notifier.unsubscribe(this, 'disabled');\n });\n\n prev?.filter<ListOptionGroup>(isListOptionGroup).forEach(el => {\n const notifier = Observable.getNotifier(el);\n notifier.unsubscribe(this, 'hidden');\n notifier.unsubscribe(this, 'visuallyHidden');\n notifier.unsubscribe(this, 'listOptions');\n });\n const options = this.getSlottedOptions(next);\n super.slottedOptionsChanged(prev, options);\n\n options.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.subscribe(this, 'value');\n notifier.subscribe(this, 'hidden');\n notifier.subscribe(this, 'disabled');\n });\n next?.filter<ListOptionGroup>(isListOptionGroup).forEach(el => {\n this.updateAdjacentSeparatorState(el);\n const notifier = Observable.getNotifier(el);\n notifier.subscribe(this, 'hidden');\n notifier.subscribe(this, 'visuallyHidden');\n notifier.subscribe(this, 'listOptions');\n });\n this.setProxyOptions();\n this.updateValue();\n // We need to force an update to the filteredOptions observable\n // (by calling 'filterOptions()) so that the template correctly updates.\n this.filterOptions();\n if (value) {\n this.value = value;\n }\n }\n\n /**\n * @internal\n */\n public override clickHandler(e: MouseEvent): BooleanOrVoid {\n // do nothing if the select is disabled\n if (this.disabled) {\n return;\n }\n\n let optionClicked = false;\n if (this.open) {\n const captured = (e.target as HTMLElement).closest<ListOption>(\n 'option,[role=option]'\n );\n optionClicked = captured !== null;\n\n if (captured?.disabled) {\n return;\n }\n }\n\n const previousSelectedIndex = this.selectedIndex;\n super.clickHandler(e);\n\n if (\n this.open\n && this.selectedIndex !== previousSelectedIndex\n && optionClicked\n ) {\n this.updateValue(true);\n }\n this.open = this.collapsible && !this.open;\n }\n\n /**\n * Updates the value when an option's value changes.\n *\n * @param source - the source object\n * @param propertyName - the property to evaluate\n *\n * @internal\n * @override\n */\n public override handleChange(source: unknown, propertyName: string): void {\n // don't call super.handleChange so hidden options can be selected programmatically\n const sourceElement = source as Element;\n switch (propertyName) {\n case 'value': {\n this.updateValue();\n break;\n }\n case 'selected': {\n if (isListOption(sourceElement) && sourceElement.selected) {\n this.selectedIndex = this.options.indexOf(sourceElement);\n } else {\n this.clearSelect();\n }\n break;\n }\n case 'hidden': {\n if (isListOption(sourceElement)) {\n sourceElement.visuallyHidden = sourceElement.hidden;\n this.updateAdjacentSeparatorState(sourceElement);\n } else if (isListOptionGroup(sourceElement)) {\n sourceElement.listOptions.forEach(e => {\n e.visuallyHidden = sourceElement.hidden;\n });\n this.updateAdjacentSeparatorState(sourceElement);\n }\n this.filterOptions();\n this.updateDisplayValue();\n break;\n }\n case 'visuallyHidden': {\n if (\n isListOptionGroup(sourceElement)\n || isListOption(sourceElement)\n ) {\n this.updateAdjacentSeparatorState(sourceElement);\n }\n break;\n }\n case 'disabled': {\n this.updateDisplayValue();\n break;\n }\n case 'listOptions': {\n // force refresh of slotted options for groups\n this.slottedOptionsChanged(\n this.slottedOptions,\n this.slottedOptions\n );\n break;\n }\n default:\n break;\n }\n }\n\n /**\n * Prevents focus when size is set and a scrollbar is clicked.\n *\n * @param e - the mouse event object\n *\n * @override\n * @internal\n */\n public override mousedownHandler(e: MouseEvent): BooleanOrVoid {\n if (e.offsetX >= 0 && e.offsetX <= this.listbox?.scrollWidth) {\n return super.mousedownHandler(e);\n }\n\n return this.collapsible;\n }\n\n /**\n * @internal\n */\n public regionLoadedHandler(): void {\n this.focusAndScrollOptionIntoView();\n }\n\n /**\n * Sets the multiple property on the proxy element.\n *\n * @param prev - the previous multiple value\n * @param next - the current multiple value\n */\n public override multipleChanged(\n prev: boolean | undefined,\n next: boolean\n ): void {\n super.multipleChanged(prev, next);\n\n if (this.proxy) {\n this.proxy.multiple = next;\n }\n }\n\n /**\n * @internal\n */\n public ignoreClickHandler(e: MouseEvent): void {\n e.stopPropagation();\n }\n\n /**\n * @internal\n */\n public clearClickHandler(e: MouseEvent): void {\n this.open = false;\n this.clearSelect();\n this.updateValue(true);\n e.stopPropagation();\n }\n\n /**\n * @internal\n */\n public updateDisplayValue(): void {\n const placeholderOption = this.getPlaceholderOption();\n if (\n placeholderOption\n && this.firstSelectedOption === placeholderOption\n ) {\n this.displayPlaceholder = true;\n } else {\n this.displayPlaceholder = false;\n }\n\n Observable.notify(this, 'displayValue');\n }\n\n /**\n * Handle content changes on the control input.\n *\n * @param e - the input event\n * @internal\n */\n public inputHandler(e: InputEvent): boolean {\n this.filter = this.filterInput?.value ?? '';\n if (this.filterMode === FilterMode.standard) {\n this.filterOptions();\n\n const enabledOptions = this.filteredOptions.filter(\n o => !o.disabled\n );\n let activeOptionIndex = this.filter !== ''\n ? (this.openActiveIndex ?? this.selectedIndex)\n : this.selectedIndex;\n\n if (\n enabledOptions.length > 0\n && !enabledOptions.find(o => o === this.options[activeOptionIndex])\n ) {\n activeOptionIndex = this.options.indexOf(enabledOptions[0]!);\n } else if (enabledOptions.length === 0) {\n activeOptionIndex = -1;\n }\n this.setActiveOption(activeOptionIndex);\n }\n\n if (this.filterMode !== FilterMode.none) {\n this.emitFilterInputEvent();\n }\n\n if (e.inputType.includes('deleteContent') || !this.filter.length) {\n return true;\n }\n\n e.stopPropagation();\n return true;\n }\n\n /**\n * @internal\n */\n public override focusoutHandler(e: FocusEvent): BooleanOrVoid {\n super.focusoutHandler(e);\n if (!this.open) {\n return true;\n }\n\n this.open = false;\n const focusTarget = e.relatedTarget as HTMLElement;\n if (this.isSameNode(focusTarget)) {\n this.focus();\n return true;\n }\n\n return true;\n }\n\n /**\n * @internal\n */\n public override keydownHandler(e: KeyboardEvent): BooleanOrVoid {\n const initialSelectedIndex = this.selectedIndex;\n const key = e.key;\n if (e.ctrlKey || e.shiftKey) {\n return true;\n }\n\n if (key !== keyArrowDown && key !== keyArrowUp) {\n super.keydownHandler(e);\n }\n\n let currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n let commitValueThenClose = false;\n switch (key) {\n case keyArrowDown: {\n const selectedOption = this.options[this.selectedIndex];\n if (\n this.open\n && isListOption(selectedOption)\n && !isOptionOrGroupVisible(selectedOption)\n ) {\n if (this.openActiveIndex === this.selectedIndex) {\n this.selectFirstOption();\n } else {\n this.selectNextOption();\n }\n } else {\n super.keydownHandler(e);\n }\n\n // update currentActiveIndex again as dependent state may have changed\n currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n break;\n }\n case keyArrowUp: {\n const selectedOption = this.options[this.selectedIndex];\n if (\n this.open\n && isListOption(selectedOption)\n && !isOptionOrGroupVisible(selectedOption)\n ) {\n if (this.openActiveIndex === this.selectedIndex) {\n this.selectLastOption();\n } else {\n this.selectPreviousOption();\n }\n } else {\n super.keydownHandler(e);\n }\n\n // update currentActiveIndex again as dependent state may have changed\n currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n break;\n }\n case keySpace: {\n // when dropdown is open allow user to enter a space for filter text\n if (this.open && this.filterMode !== FilterMode.none) {\n break;\n }\n\n e.preventDefault();\n if (this.collapsible && this.typeAheadExpired) {\n this.open = !this.open;\n }\n if (!this.open) {\n this.focus();\n }\n break;\n }\n case keyHome:\n case keyEnd: {\n e.preventDefault();\n break;\n }\n case keyEnter: {\n e.preventDefault();\n if (\n this.filteredOptions.length === 0\n || this.filteredOptions.every(o => o.disabled)\n ) {\n return false;\n }\n if (this.open) {\n commitValueThenClose = true;\n } else {\n this.open = true;\n }\n\n if (commitValueThenClose) {\n this.focus();\n }\n break;\n }\n case keyEscape: {\n if (!this.open) {\n if (this.clearable) {\n this.clearSelect();\n this.updateValue(true);\n return true;\n }\n\n break;\n }\n\n if (this.collapsible && this.open) {\n e.preventDefault();\n this.open = false;\n }\n\n currentActiveIndex = this.selectedIndex;\n this.focus();\n break;\n }\n\n default: {\n break;\n }\n }\n\n if (!this.open || commitValueThenClose) {\n if (this.selectedIndex !== currentActiveIndex) {\n this.selectedIndex = currentActiveIndex;\n }\n\n if (initialSelectedIndex !== this.selectedIndex) {\n this.updateValue(true);\n }\n }\n\n if (commitValueThenClose) {\n this.open = false;\n }\n\n return !(key === keyArrowDown || key === keyArrowUp);\n }\n\n /**\n * Updates the proxy value when the selected index changes.\n *\n * @param prev - the previous selected index\n * @param next - the next selected index\n *\n * @internal\n */\n public override selectedIndexChanged(\n _: number | undefined,\n __: number\n ): void {\n // Don't call super.selectedIndexChanged as this will disallow disabled options\n // from being valid initial selected values. Our setDefaultSelectedOption\n // implementation handles skipping non-selected disabled options for the initial\n // selected value.\n this.setSelectedOptions();\n if (this.open) {\n this.setActiveOption(this.selectedIndex);\n }\n this.updateValue();\n }\n\n /**\n * @internal\n * Fork of Listbox implementation, so that the selectedIndex is not changed while the dropdown\n * is open.\n */\n public override typeaheadBufferChanged(_: string, __: string): void {\n if (this.$fastController.isConnected) {\n const typeaheadMatches = this.getTypeaheadMatches();\n\n if (typeaheadMatches.length) {\n const activeOptionIndex = this.options.indexOf(\n typeaheadMatches[0] as ListOption\n );\n if (!(this.open && this.filterMode !== FilterMode.none)) {\n this.setActiveOption(activeOptionIndex);\n }\n }\n\n this.typeaheadExpired = false;\n }\n }\n\n /**\n * Synchronize the `aria-disabled` property when the `disabled` property changes.\n *\n * @param prev - The previous disabled value\n * @param next - The next disabled value\n *\n * @internal\n */\n public override disabledChanged(prev: boolean, next: boolean): void {\n if (super.disabledChanged) {\n super.disabledChanged(prev, next);\n }\n this.ariaDisabled = this.disabled ? 'true' : 'false';\n }\n\n /**\n * Reset the element to its first selectable option when its parent form is reset.\n *\n * @internal\n */\n public override formResetCallback(): void {\n this.setProxyOptions();\n // Call the base class's implementation setDefaultSelectedOption instead of the select's\n // override, in order to reset the selectedIndex without using the value property.\n super.setDefaultSelectedOption();\n if (this.selectedIndex === -1) {\n this.selectedIndex = 0;\n }\n }\n\n /**\n * @internal\n */\n public override selectNextOption(): void {\n // don't call super.selectNextOption as that relies on side-effecty\n // behavior to not select disabled option (which no longer works)\n const startIndex = this.openActiveIndex ?? this.selectedIndex;\n for (let i = startIndex + 1; i < this.options.length; i++) {\n const listOption = this.options[i]!;\n if (isListOption(listOption) && isOptionSelectable(listOption)) {\n this.setActiveOption(i);\n break;\n }\n }\n }\n\n /**\n * @internal\n */\n public override selectPreviousOption(): void {\n // don't call super.selectPreviousOption as that relies on side-effecty\n // behavior to not select disabled option (which no longer works)\n const startIndex = this.openActiveIndex ?? this.selectedIndex;\n for (let i = startIndex - 1; i >= 0; i--) {\n const listOption = this.options[i]!;\n if (isListOption(listOption) && isOptionSelectable(listOption)) {\n this.setActiveOption(i);\n break;\n }\n }\n }\n\n /**\n * @internal\n */\n public override selectFirstOption(): void {\n const newActiveOptionIndex = this.options.findIndex(\n o => isListOption(o) && isOptionSelectable(o)\n );\n this.setActiveOption(newActiveOptionIndex);\n }\n\n /**\n * @internal\n */\n public override selectLastOption(): void {\n const newActiveOptionIndex = findLastIndex(\n this.options,\n o => isListOption(o) && isOptionSelectable(o)\n );\n this.setActiveOption(newActiveOptionIndex);\n }\n\n /**\n * @internal\n */\n public registerOption(option: ListOption): void {\n if (this.options.includes(option)) {\n return;\n }\n\n // Adding an option to the end, ultimately, isn't the correct\n // thing to do, as this will mean the option's index in the options,\n // at least temporarily, does not match the DOM order. However, it\n // is expected that a successive run of `slottedOptionsChanged` will\n // correct this order issue. See 'https://github.com/ni/nimble/issues/1915'\n // for more info.\n this.options.push(option);\n }\n\n protected override setSelectedOptions(): void {\n // Prevents parent classes from resetting selectedIndex to a positive\n // value while filtering, which can result in a disabled option being\n // selected.\n if (this.open && this.selectedIndex === -1) {\n return;\n }\n super.setSelectedOptions();\n }\n\n protected override focusAndScrollOptionIntoView(): void {\n if (this.open) {\n super.focusAndScrollOptionIntoView();\n window.requestAnimationFrame(() => {\n this.filterInput?.focus();\n });\n }\n }\n\n protected override getTypeaheadMatches(): ListboxOption[] {\n const matches = super.getTypeaheadMatches();\n // Don't allow placeholder to be matched\n return matches.filter(o => !o.hidden && !o.disabled);\n }\n\n protected positionChanged(\n _: SelectPosition | undefined,\n next: SelectPosition | undefined\n ): void {\n this.positionAttribute = next;\n this.setPositioning();\n }\n\n /**\n * Updates the proxy's size property when the size attribute changes.\n *\n * @param prev - the previous size\n * @param next - the current size\n *\n * @override\n * @internal\n */\n protected override sizeChanged(\n prev: number | undefined,\n next: number\n ): void {\n super.sizeChanged(prev, next);\n\n if (this.proxy) {\n this.proxy.size = next;\n }\n }\n\n protected openChanged(): void {\n if (!this.collapsible) {\n return;\n }\n\n if (this.open) {\n this.initializeOpenState();\n return;\n }\n\n const activeOption = this.options[this.openActiveIndex ?? this.selectedIndex];\n if (isListOption(activeOption)) {\n activeOption.activeOption = false;\n }\n this.openActiveIndex = undefined;\n this.filter = '';\n if (this.filterInput) {\n this.filterInput.value = '';\n }\n\n if (this.filterMode !== FilterMode.none) {\n this.emitFilterInputEvent();\n }\n this.ariaControls = '';\n this.ariaExpanded = 'false';\n }\n\n /**\n * Updates the selectedness of each option when the list of selected options changes.\n *\n * @param prev - the previous list of selected options\n * @param next - the current list of selected options\n *\n * @override\n * @internal\n */\n protected override selectedOptionsChanged(\n _prev: ListboxOption[] | undefined,\n next: ListboxOption[]\n ): void {\n // don't call super.selectedOptionsChanged so we don't filter out hidden elements\n // when updating 'selected' state (copied relevant super implementation)\n this.options?.forEach((o, i) => {\n const notifier = Observable.getNotifier(o);\n notifier.unsubscribe(this, 'selected');\n o.selected = next.includes(o);\n notifier.subscribe(this, 'selected');\n const proxyOption = this.proxy?.options.item(i);\n if (proxyOption) {\n proxyOption.selected = o.selected;\n }\n });\n }\n\n /**\n * Sets the selected index to match the first option with the selected attribute, or\n * the first selectable option.\n *\n * @override\n * @internal\n */\n protected override setDefaultSelectedOption(): void {\n const options: ListboxOption[] = this.options\n ?? Array.from(this.children).filter(o => isListOption(o));\n\n const optionIsSelected = (option: ListboxOption): boolean => {\n return option.hasAttribute('selected') || option.selected;\n };\n let selectedIndex = -1;\n let firstValidOptionIndex = -1;\n let placeholderIndex = -1;\n for (let i = 0; i < options?.length; i++) {\n const option = options[i]!;\n if (optionIsSelected(option) || option.value === this.value) {\n selectedIndex = i;\n break;\n } else if (placeholderIndex === -1 && isOptionPlaceholder(option)) {\n placeholderIndex = i;\n } else if (\n firstValidOptionIndex === -1\n && isOptionSelectable(option as ListOption)\n ) {\n firstValidOptionIndex = i;\n }\n }\n\n if (selectedIndex !== -1) {\n this.selectedIndex = selectedIndex;\n } else if (placeholderIndex !== -1) {\n this.selectedIndex = placeholderIndex;\n } else if (firstValidOptionIndex !== -1) {\n this.selectedIndex = firstValidOptionIndex;\n } else {\n this.selectedIndex = 0;\n }\n }\n\n private getSlottedOptions(\n slottedElements: Element[] | undefined\n ): ListboxOption[] {\n const options: ListOption[] = [];\n slottedElements?.forEach(el => {\n if (isListOption(el)) {\n options.push(el);\n } else if (isListOptionGroup(el)) {\n options.push(...this.getGroupOptions(el));\n }\n });\n\n return options;\n }\n\n private setActiveOption(newActiveIndex: number): void {\n const activeOption = this.options[newActiveIndex];\n if (this.open) {\n if (isListOption(activeOption)) {\n activeOption.activeOption = true;\n }\n\n const previousActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n const previousActiveOption = this.options[previousActiveIndex];\n if (\n previousActiveIndex !== newActiveIndex\n && isListOption(previousActiveOption)\n ) {\n previousActiveOption.activeOption = false;\n }\n\n this.openActiveIndex = newActiveIndex;\n this.focusAndScrollActiveOptionIntoView();\n } else {\n this.selectedIndex = newActiveIndex;\n }\n\n this.ariaActiveDescendant = activeOption?.id ?? '';\n }\n\n private focusAndScrollActiveOptionIntoView(): void {\n const optionToFocus = this.options[this.openActiveIndex ?? this.selectedIndex];\n // Copied from FAST: To ensure that the browser handles both `focus()` and\n // `scrollIntoView()`, the timing here needs to guarantee that they happen on\n // different frames. Since this function is typically called from the `openChanged`\n // observer, `DOM.queueUpdate` causes the calls to be grouped into the same frame.\n // To prevent this, `requestAnimationFrame` is used instead of `DOM.queueUpdate`.\n if (optionToFocus !== undefined && this.contains(optionToFocus)) {\n optionToFocus.focus();\n requestAnimationFrame(() => {\n optionToFocus.scrollIntoView({ block: 'nearest' });\n });\n }\n }\n\n private getPlaceholderOption(): ListOption | undefined {\n return this.options.find(o => o.hidden && o.disabled) as ListOption;\n }\n\n private setPositioning(): void {\n if (!this.$fastController.isConnected) {\n // Don't call setPositioning() until we're connected,\n // since this.forcedPosition isn't initialized yet.\n return;\n }\n const currentBox = this.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const availableBottom = viewportHeight - currentBox.bottom;\n\n if (this.forcedPosition) {\n this.position = this.positionAttribute;\n } else if (currentBox.top > availableBottom) {\n this.position = SelectPosition.above;\n } else {\n this.position = SelectPosition.below;\n }\n\n this.positionAttribute = this.forcedPosition\n ? this.positionAttribute\n : this.position;\n\n this.availableViewportHeight = this.position === SelectPosition.above\n ? Math.trunc(currentBox.top)\n : Math.trunc(availableBottom);\n }\n\n private updateAdjacentSeparatorState(\n element: ListOptionGroup | ListOption\n ): void {\n const previousElement = this.getPreviousVisibleOptionOrGroup(element);\n const nextElement = this.getNextVisibleOptionOrGroup(element);\n\n if (isOptionOrGroupVisible(element)) {\n const topSeparatorVisible = isListOption(previousElement);\n this.setTopSeparatorState(element, topSeparatorVisible);\n const bottomSeparatorVisible = nextElement !== null;\n this.setBottomSeparatorState(element, bottomSeparatorVisible);\n this.setBottomSeparatorState(previousElement, true);\n } else {\n const nextTopSeparatorVisible = isListOption(previousElement);\n this.setTopSeparatorState(nextElement, nextTopSeparatorVisible);\n const previousBottomSeparatorVisible = nextElement !== null;\n this.setBottomSeparatorState(\n previousElement,\n previousBottomSeparatorVisible\n );\n }\n }\n\n private setTopSeparatorState(\n element: ListOptionGroup | ListOption | null,\n visible: boolean\n ): void {\n if (isListOptionGroup(element)) {\n element.topSeparatorVisible = visible;\n }\n }\n\n private setBottomSeparatorState(\n element: ListOptionGroup | ListOption | null,\n visible: boolean\n ): void {\n if (isListOptionGroup(element)) {\n element.bottomSeparatorVisible = visible;\n }\n }\n\n private getPreviousVisibleOptionOrGroup(\n element: HTMLElement\n ): ListOption | ListOptionGroup | null {\n let previousElement = element.previousElementSibling;\n while (previousElement) {\n if (\n (isListOption(previousElement)\n || isListOptionGroup(previousElement))\n && isOptionOrGroupVisible(previousElement)\n ) {\n return previousElement;\n }\n previousElement = previousElement.previousElementSibling;\n }\n return null;\n }\n\n private getNextVisibleOptionOrGroup(\n element: HTMLElement\n ): ListOption | ListOptionGroup | null {\n let nextElement = element.nextElementSibling;\n while (nextElement) {\n if (\n (isListOption(nextElement) || isListOptionGroup(nextElement))\n && isOptionOrGroupVisible(nextElement)\n ) {\n return nextElement;\n }\n nextElement = nextElement.nextElementSibling;\n }\n return null;\n }\n\n private isOptionHiddenOrFilteredOut(option: ListOption): boolean {\n if (option.hidden) {\n return true;\n }\n return this.filterMode === FilterMode.standard\n ? !this.filterMatchesText(option.text)\n : false;\n }\n\n private filterMatchesText(text: string): boolean {\n const filter = this.filter.toLowerCase();\n const normalizedFilter = diacriticInsensitiveStringNormalizer(filter);\n return diacriticInsensitiveStringNormalizer(text).includes(\n normalizedFilter\n );\n }\n\n /**\n * Filter available options by text value.\n *\n * @public\n */\n private filterOptions(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n\n const filteredOptions: ListOption[] = [];\n for (const element of this.slottedOptions) {\n if (isListOptionGroup(element)) {\n if (element.hidden) {\n continue; // no need to process hidden groups\n }\n const groupOptions = this.getGroupOptions(element);\n const groupMatchesFilter = this.filterMatchesText(\n element.labelContent\n );\n groupOptions.forEach(option => {\n option.visuallyHidden = groupMatchesFilter\n ? false\n : this.isOptionHiddenOrFilteredOut(option);\n if (!option.visuallyHidden) {\n filteredOptions.push(option);\n }\n });\n } else if (isListOption(element)) {\n element.visuallyHidden = this.isOptionHiddenOrFilteredOut(element);\n if (!element.visuallyHidden) {\n filteredOptions.push(element);\n }\n }\n }\n\n this.filteredOptions = filteredOptions;\n }\n\n private getGroupOptions(group: ListOptionGroup): ListOption[] {\n return Array.from(group.children)\n .filter(el => isListOption(el))\n .map(el => {\n if (group.hidden && isListOption(el)) {\n el.visuallyHidden = true;\n }\n\n return el;\n }) as ListOption[];\n }\n\n /**\n * Sets the value and display value to match the first selected option.\n *\n * @param shouldEmit - if true, the input and change events will be emitted\n *\n * @internal\n */\n private updateValue(shouldEmit?: boolean): void {\n if (this.$fastController.isConnected) {\n this.value = this.firstSelectedOption?.value ?? '';\n }\n\n if (shouldEmit) {\n this.$emit('input');\n this.$emit('change', this, {\n bubbles: true,\n composed: undefined\n });\n }\n }\n\n private clearSelect(): void {\n const placeholder = this.getPlaceholderOption();\n this.selectedIndex = placeholder\n ? this.options.indexOf(placeholder)\n : -1;\n }\n\n /**\n * Resets and fills the proxy to match the component's options.\n *\n * @internal\n */\n private setProxyOptions(): void {\n if (this.proxy instanceof HTMLSelectElement && this.options) {\n this.proxy.options.length = 0;\n this.options.forEach(option => {\n const proxyOption = option.proxy\n || (option instanceof HTMLOptionElement\n ? option.cloneNode()\n : null);\n\n if (proxyOption) {\n this.proxy.options.add(proxyOption);\n }\n });\n }\n }\n\n private filterChanged(): void {\n this.filterOptions();\n }\n\n private emitFilterInputEvent(): void {\n const eventDetail: SelectFilterInputEventDetail = {\n filterText: this.filter\n };\n\n this.$emit('filter-input', eventDetail, { bubbles: true });\n }\n\n private initializeOpenState(): void {\n this.setActiveOption(this.selectedIndex);\n this.ariaControls = this.listboxId;\n this.ariaExpanded = 'true';\n\n this.setPositioning();\n this.focusAndScrollOptionIntoView();\n }\n}\n\nconst nimbleSelect = Select.compose<SelectOptions>({\n baseName: 'select',\n baseClass: FoundationSelect,\n template,\n styles,\n indicator: arrowExpanderDown16X16.data,\n end: html<Select>`\n <${iconExclamationMarkTag}\n severity=\"error\"\n class=\"error-icon\"\n ></${iconExclamationMarkTag}>\n ${errorTextTemplate}\n `\n});\n\napplyMixins(Select, StartEnd, DelegatesARIASelect);\nDesignSystem.getOrCreate().withPrefix('nimble').register(nimbleSelect());\nexport const selectTag = 'nimble-select';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/select/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Based on: https://github.com/microsoft/fast/blob/%40microsoft/fast-foundation_v2.49.5/packages/web-components/fast-foundation/src/select/select.ts\nimport {\n attr,\n html,\n observable,\n Observable,\n volatile\n} from '@microsoft/fast-element';\nimport {\n AnchoredRegion,\n DesignSystem,\n Select as FoundationSelect,\n ListboxOption,\n SelectOptions,\n SelectPosition,\n applyMixins,\n StartEnd,\n DelegatesARIASelect\n} from '@microsoft/fast-foundation';\nimport {\n findLastIndex,\n keyArrowDown,\n keyArrowUp,\n keyEnd,\n keyEnter,\n keyEscape,\n keyHome,\n keySpace,\n uniqueId\n} from '@microsoft/fast-web-utilities';\nimport { arrowExpanderDown16X16 } from '@ni/nimble-tokens/dist/icons/js';\nimport { styles } from './styles';\nimport {\n DropdownAppearance,\n ListOptionOwner\n} from '../patterns/dropdown/types';\nimport { errorTextTemplate } from '../patterns/error/template';\nimport type { ErrorPattern } from '../patterns/error/types';\nimport { iconExclamationMarkTag } from '../icons/exclamation-mark';\nimport { isListOption, isListOptionGroup, template } from './template';\nimport type { ListOption } from '../list-option';\nimport { FilterMode, SelectFilterInputEventDetail } from './types';\nimport { diacriticInsensitiveStringNormalizer } from '../utilities/models/string-normalizers';\nimport { FormAssociatedSelect } from './models/select-form-associated';\nimport type { ListOptionGroup } from '../list-option-group';\nimport { slotTextContent } from '../utilities/models/slot-text-content';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-select': Select;\n }\n}\n\n// Used in overrides of base class methods\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\ntype BooleanOrVoid = boolean | void;\n\nconst isOptionSelectable = (el: ListOption): boolean => {\n return !el.visuallyHidden && !el.disabled && !el.hidden;\n};\n\nconst isOptionPlaceholder = (el: ListboxOption): boolean => {\n return el.disabled && el.hidden;\n};\n\nconst isOptionOrGroupVisible = (el: ListOption | ListOptionGroup): boolean => {\n return !el.visuallyHidden && !el.hidden;\n};\n\n/**\n * A nimble-styled HTML select.\n */\nexport class Select\n extends FormAssociatedSelect\n implements ErrorPattern, ListOptionOwner {\n @attr\n public appearance: DropdownAppearance = DropdownAppearance.underline;\n\n /**\n * Reflects the placement for the listbox when the select is open.\n *\n * @public\n */\n @attr({ attribute: 'position' })\n public positionAttribute?: SelectPosition;\n\n /**\n * A message explaining why the value is invalid.\n *\n * @public\n * @remarks\n * HTML Attribute: error-text\n */\n @attr({ attribute: 'error-text' })\n public errorText: string | undefined;\n\n @attr({ attribute: 'error-visible', mode: 'boolean' })\n public errorVisible = false;\n\n @attr({ attribute: 'filter-mode' })\n public filterMode: FilterMode = FilterMode.none;\n\n @attr({ attribute: 'clearable', mode: 'boolean' })\n public clearable = false;\n\n @attr({ attribute: 'loading-visible', mode: 'boolean' })\n public loadingVisible = false;\n\n /**\n * @internal\n */\n @observable\n public displayPlaceholder = false;\n\n /**\n * @internal\n */\n @attr({ attribute: 'open', mode: 'boolean' })\n public open = false;\n\n /**\n * Holds the current state for the calculated position of the listbox.\n *\n * @public\n */\n @observable\n public position?: SelectPosition;\n\n /**\n * The ref to the internal `.control` element.\n *\n * @internal\n */\n @observable\n public control!: HTMLElement;\n\n /**\n * Reference to the internal listbox element.\n *\n * @internal\n */\n public listbox!: HTMLDivElement;\n\n /**\n * The unique id for the internal listbox element.\n *\n * @internal\n */\n public listboxId: string = uniqueId('listbox-');\n\n /**\n * @internal\n */\n @observable\n public scrollableRegion!: HTMLElement;\n\n /**\n * @internal\n */\n @observable\n public filterInput?: HTMLInputElement;\n\n /**\n * @internal\n */\n @observable\n public anchoredRegion!: AnchoredRegion;\n\n /** @internal */\n @observable\n public hasOverflow = false;\n\n /**\n * @internal\n */\n @observable\n public filteredOptions: ListboxOption[] = [];\n\n /**\n * @internal\n */\n @observable\n public filter = '';\n\n /**\n * The space available in the viewport for the listbox when opened.\n *\n * @internal\n */\n @observable\n public availableViewportHeight = 0;\n\n /**\n * The component is collapsible when in single-selection mode with no size attribute.\n *\n * @internal\n */\n @volatile\n public get collapsible(): boolean {\n return !(this.multiple || typeof this.size === 'number');\n }\n\n /** @internal */\n public labelSlot!: HTMLSlotElement;\n\n /** @internal */\n @volatile\n public get labelContent(): string {\n if (!this.$fastController.isConnected) {\n return '';\n }\n\n return slotTextContent(this.labelSlot);\n }\n\n private _value = '';\n private forcedPosition = false;\n private openActiveIndex?: number;\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n this.forcedPosition = !!this.positionAttribute;\n if (this.open) {\n this.initializeOpenState();\n }\n }\n\n public override get value(): string {\n Observable.track(this, 'value');\n return this._value;\n }\n\n public override set value(next: string) {\n const prev = this._value;\n let newValue = next;\n\n if (this.options?.length) {\n const newValueIndex = this.options.findIndex(\n el => el.value === newValue\n );\n const prevSelectedValue = this.options[this.selectedIndex]?.value ?? null;\n const nextSelectedValue = this.options[newValueIndex]?.value ?? null;\n\n if (\n newValueIndex === -1\n || prevSelectedValue !== nextSelectedValue\n ) {\n newValue = '';\n this.selectedIndex = newValueIndex;\n }\n\n newValue = this.firstSelectedOption?.value ?? newValue;\n }\n\n if (prev !== newValue) {\n this._value = newValue;\n super.valueChanged(prev, newValue);\n Observable.notify(this, 'value');\n this.updateDisplayValue();\n }\n }\n\n /**\n * @internal\n */\n @volatile\n public get displayValue(): string {\n Observable.track(this, 'displayValue');\n return this.firstSelectedOption?.text ?? '';\n }\n\n /**\n * @internal\n */\n public anchoredRegionChanged(\n _prev: AnchoredRegion | undefined,\n _next: AnchoredRegion | undefined\n ): void {\n if (this.anchoredRegion && this.control) {\n this.anchoredRegion.anchorElement = this.control;\n }\n }\n\n /**\n * @internal\n */\n public controlChanged(\n _prev: HTMLElement | undefined,\n _next: HTMLElement | undefined\n ): void {\n if (this.anchoredRegion && this.control) {\n this.anchoredRegion.anchorElement = this.control;\n }\n }\n\n /**\n * @internal\n */\n public override slottedOptionsChanged(\n prev: Element[] | undefined,\n next: Element[] | undefined\n ): void {\n const value = this.value;\n this.options.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.unsubscribe(this, 'value');\n notifier.unsubscribe(this, 'hidden');\n notifier.unsubscribe(this, 'disabled');\n });\n\n prev?.filter<ListOptionGroup>(isListOptionGroup).forEach(el => {\n const notifier = Observable.getNotifier(el);\n notifier.unsubscribe(this, 'hidden');\n notifier.unsubscribe(this, 'visuallyHidden');\n notifier.unsubscribe(this, 'listOptions');\n });\n const options = this.getSlottedOptions(next);\n super.slottedOptionsChanged(prev, options);\n\n options.forEach(o => {\n const notifier = Observable.getNotifier(o);\n notifier.subscribe(this, 'value');\n notifier.subscribe(this, 'hidden');\n notifier.subscribe(this, 'disabled');\n });\n next?.filter<ListOptionGroup>(isListOptionGroup).forEach(el => {\n this.updateAdjacentSeparatorState(el);\n const notifier = Observable.getNotifier(el);\n notifier.subscribe(this, 'hidden');\n notifier.subscribe(this, 'visuallyHidden');\n notifier.subscribe(this, 'listOptions');\n });\n this.setProxyOptions();\n this.updateValue();\n // We need to force an update to the filteredOptions observable\n // (by calling 'filterOptions()) so that the template correctly updates.\n this.filterOptions();\n if (value) {\n this.value = value;\n }\n }\n\n /**\n * @internal\n */\n public override clickHandler(e: MouseEvent): BooleanOrVoid {\n // do nothing if the select is disabled\n if (this.disabled) {\n return;\n }\n\n let optionClicked = false;\n if (this.open) {\n const captured = (e.target as HTMLElement).closest<ListOption>(\n 'option,[role=option]'\n );\n optionClicked = captured !== null;\n\n if (captured?.disabled) {\n return;\n }\n }\n\n const previousSelectedIndex = this.selectedIndex;\n super.clickHandler(e);\n\n if (\n this.open\n && this.selectedIndex !== previousSelectedIndex\n && optionClicked\n ) {\n this.updateValue(true);\n }\n this.open = this.collapsible && !this.open;\n }\n\n /**\n * Updates the value when an option's value changes.\n *\n * @param source - the source object\n * @param propertyName - the property to evaluate\n *\n * @internal\n * @override\n */\n public override handleChange(source: unknown, propertyName: string): void {\n // don't call super.handleChange so hidden options can be selected programmatically\n const sourceElement = source as Element;\n switch (propertyName) {\n case 'value': {\n this.updateValue();\n break;\n }\n case 'selected': {\n if (isListOption(sourceElement) && sourceElement.selected) {\n this.selectedIndex = this.options.indexOf(sourceElement);\n } else {\n this.clearSelect();\n }\n break;\n }\n case 'hidden': {\n if (isListOption(sourceElement)) {\n sourceElement.visuallyHidden = sourceElement.hidden;\n this.updateAdjacentSeparatorState(sourceElement);\n } else if (isListOptionGroup(sourceElement)) {\n sourceElement.listOptions.forEach(e => {\n e.visuallyHidden = sourceElement.hidden;\n });\n this.updateAdjacentSeparatorState(sourceElement);\n }\n this.filterOptions();\n this.updateDisplayValue();\n break;\n }\n case 'visuallyHidden': {\n if (\n isListOptionGroup(sourceElement)\n || isListOption(sourceElement)\n ) {\n this.updateAdjacentSeparatorState(sourceElement);\n }\n break;\n }\n case 'disabled': {\n this.updateDisplayValue();\n break;\n }\n case 'listOptions': {\n // force refresh of slotted options for groups\n this.slottedOptionsChanged(\n this.slottedOptions,\n this.slottedOptions\n );\n break;\n }\n default:\n break;\n }\n }\n\n /**\n * Prevents focus when size is set and a scrollbar is clicked.\n *\n * @param e - the mouse event object\n *\n * @override\n * @internal\n */\n public override mousedownHandler(e: MouseEvent): BooleanOrVoid {\n if (e.offsetX >= 0 && e.offsetX <= this.listbox?.scrollWidth) {\n return super.mousedownHandler(e);\n }\n\n return this.collapsible;\n }\n\n /**\n * @internal\n */\n public regionLoadedHandler(): void {\n this.focusAndScrollOptionIntoView();\n }\n\n /**\n * Sets the multiple property on the proxy element.\n *\n * @param prev - the previous multiple value\n * @param next - the current multiple value\n */\n public override multipleChanged(\n prev: boolean | undefined,\n next: boolean\n ): void {\n super.multipleChanged(prev, next);\n\n if (this.proxy) {\n this.proxy.multiple = next;\n }\n }\n\n /**\n * @internal\n */\n public ignoreClickHandler(e: MouseEvent): void {\n e.stopPropagation();\n }\n\n /**\n * @internal\n */\n public clearClickHandler(e: MouseEvent): void {\n this.open = false;\n this.clearSelect();\n this.updateValue(true);\n e.stopPropagation();\n }\n\n /**\n * @internal\n */\n public updateDisplayValue(): void {\n const placeholderOption = this.getPlaceholderOption();\n if (\n placeholderOption\n && this.firstSelectedOption === placeholderOption\n ) {\n this.displayPlaceholder = true;\n } else {\n this.displayPlaceholder = false;\n }\n\n Observable.notify(this, 'displayValue');\n }\n\n /**\n * Handle content changes on the control input.\n *\n * @param e - the input event\n * @internal\n */\n public inputHandler(e: InputEvent): boolean {\n this.filter = this.filterInput?.value ?? '';\n if (this.filterMode === FilterMode.standard) {\n this.filterOptions();\n\n const enabledOptions = this.filteredOptions.filter(\n o => !o.disabled\n );\n let activeOptionIndex = this.filter !== ''\n ? (this.openActiveIndex ?? this.selectedIndex)\n : this.selectedIndex;\n\n if (\n enabledOptions.length > 0\n && !enabledOptions.find(o => o === this.options[activeOptionIndex])\n ) {\n activeOptionIndex = this.options.indexOf(enabledOptions[0]!);\n } else if (enabledOptions.length === 0) {\n activeOptionIndex = -1;\n }\n this.setActiveOption(activeOptionIndex);\n }\n\n if (this.filterMode !== FilterMode.none) {\n this.emitFilterInputEvent();\n }\n\n if (e.inputType.includes('deleteContent') || !this.filter.length) {\n return true;\n }\n\n e.stopPropagation();\n return true;\n }\n\n /**\n * @internal\n */\n public override focusoutHandler(e: FocusEvent): BooleanOrVoid {\n super.focusoutHandler(e);\n if (!this.open) {\n return true;\n }\n\n this.open = false;\n const focusTarget = e.relatedTarget as HTMLElement;\n if (this.isSameNode(focusTarget)) {\n this.focus();\n return true;\n }\n\n return true;\n }\n\n /**\n * @internal\n */\n public override keydownHandler(e: KeyboardEvent): BooleanOrVoid {\n const initialSelectedIndex = this.selectedIndex;\n const key = e.key;\n if (e.ctrlKey || e.shiftKey) {\n return true;\n }\n\n if (key !== keyArrowDown && key !== keyArrowUp) {\n super.keydownHandler(e);\n }\n\n let currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n let commitValueThenClose = false;\n switch (key) {\n case keyArrowDown: {\n const selectedOption = this.options[this.selectedIndex];\n if (\n this.open\n && isListOption(selectedOption)\n && !isOptionOrGroupVisible(selectedOption)\n ) {\n if (this.openActiveIndex === this.selectedIndex) {\n this.selectFirstOption();\n } else {\n this.selectNextOption();\n }\n } else {\n super.keydownHandler(e);\n }\n\n // update currentActiveIndex again as dependent state may have changed\n currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n break;\n }\n case keyArrowUp: {\n const selectedOption = this.options[this.selectedIndex];\n if (\n this.open\n && isListOption(selectedOption)\n && !isOptionOrGroupVisible(selectedOption)\n ) {\n if (this.openActiveIndex === this.selectedIndex) {\n this.selectLastOption();\n } else {\n this.selectPreviousOption();\n }\n } else {\n super.keydownHandler(e);\n }\n\n // update currentActiveIndex again as dependent state may have changed\n currentActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n break;\n }\n case keySpace: {\n // when dropdown is open allow user to enter a space for filter text\n if (this.open && this.filterMode !== FilterMode.none) {\n break;\n }\n\n e.preventDefault();\n if (this.collapsible && this.typeAheadExpired) {\n this.open = !this.open;\n }\n if (!this.open) {\n this.focus();\n }\n break;\n }\n case keyHome:\n case keyEnd: {\n e.preventDefault();\n break;\n }\n case keyEnter: {\n e.preventDefault();\n if (\n this.filteredOptions.length === 0\n || this.filteredOptions.every(o => o.disabled)\n ) {\n return false;\n }\n if (this.open) {\n commitValueThenClose = true;\n } else {\n this.open = true;\n }\n\n if (commitValueThenClose) {\n this.focus();\n }\n break;\n }\n case keyEscape: {\n if (!this.open) {\n if (this.clearable) {\n this.clearSelect();\n this.updateValue(true);\n return true;\n }\n\n break;\n }\n\n if (this.collapsible && this.open) {\n e.preventDefault();\n this.open = false;\n }\n\n currentActiveIndex = this.selectedIndex;\n this.focus();\n break;\n }\n\n default: {\n break;\n }\n }\n\n if (!this.open || commitValueThenClose) {\n if (this.selectedIndex !== currentActiveIndex) {\n this.selectedIndex = currentActiveIndex;\n }\n\n if (initialSelectedIndex !== this.selectedIndex) {\n this.updateValue(true);\n }\n }\n\n if (commitValueThenClose) {\n this.open = false;\n }\n\n return !(key === keyArrowDown || key === keyArrowUp);\n }\n\n /**\n * Updates the proxy value when the selected index changes.\n *\n * @param prev - the previous selected index\n * @param next - the next selected index\n *\n * @internal\n */\n public override selectedIndexChanged(\n _: number | undefined,\n __: number\n ): void {\n // Don't call super.selectedIndexChanged as this will disallow disabled options\n // from being valid initial selected values. Our setDefaultSelectedOption\n // implementation handles skipping non-selected disabled options for the initial\n // selected value.\n this.setSelectedOptions();\n if (this.open) {\n this.setActiveOption(this.selectedIndex);\n }\n this.updateValue();\n }\n\n /**\n * @internal\n * Fork of Listbox implementation, so that the selectedIndex is not changed while the dropdown\n * is open.\n */\n public override typeaheadBufferChanged(_: string, __: string): void {\n if (this.$fastController.isConnected) {\n const typeaheadMatches = this.getTypeaheadMatches();\n\n if (typeaheadMatches.length) {\n const activeOptionIndex = this.options.indexOf(\n typeaheadMatches[0] as ListOption\n );\n if (!(this.open && this.filterMode !== FilterMode.none)) {\n this.setActiveOption(activeOptionIndex);\n }\n }\n\n this.typeaheadExpired = false;\n }\n }\n\n /**\n * Synchronize the `aria-disabled` property when the `disabled` property changes.\n *\n * @param prev - The previous disabled value\n * @param next - The next disabled value\n *\n * @internal\n */\n public override disabledChanged(prev: boolean, next: boolean): void {\n if (super.disabledChanged) {\n super.disabledChanged(prev, next);\n }\n this.ariaDisabled = this.disabled ? 'true' : 'false';\n }\n\n /**\n * Reset the element to its first selectable option when its parent form is reset.\n *\n * @internal\n */\n public override formResetCallback(): void {\n this.setProxyOptions();\n // Call the base class's implementation setDefaultSelectedOption instead of the select's\n // override, in order to reset the selectedIndex without using the value property.\n super.setDefaultSelectedOption();\n if (this.selectedIndex === -1) {\n this.selectedIndex = 0;\n }\n }\n\n /**\n * @internal\n */\n public override selectNextOption(): void {\n // don't call super.selectNextOption as that relies on side-effecty\n // behavior to not select disabled option (which no longer works)\n const startIndex = this.openActiveIndex ?? this.selectedIndex;\n for (let i = startIndex + 1; i < this.options.length; i++) {\n const listOption = this.options[i]!;\n if (isListOption(listOption) && isOptionSelectable(listOption)) {\n this.setActiveOption(i);\n break;\n }\n }\n }\n\n /**\n * @internal\n */\n public override selectPreviousOption(): void {\n // don't call super.selectPreviousOption as that relies on side-effecty\n // behavior to not select disabled option (which no longer works)\n const startIndex = this.openActiveIndex ?? this.selectedIndex;\n for (let i = startIndex - 1; i >= 0; i--) {\n const listOption = this.options[i]!;\n if (isListOption(listOption) && isOptionSelectable(listOption)) {\n this.setActiveOption(i);\n break;\n }\n }\n }\n\n /**\n * @internal\n */\n public override selectFirstOption(): void {\n const newActiveOptionIndex = this.options.findIndex(\n o => isListOption(o) && isOptionSelectable(o)\n );\n this.setActiveOption(newActiveOptionIndex);\n }\n\n /**\n * @internal\n */\n public override selectLastOption(): void {\n const newActiveOptionIndex = findLastIndex(\n this.options,\n o => isListOption(o) && isOptionSelectable(o)\n );\n this.setActiveOption(newActiveOptionIndex);\n }\n\n /**\n * @internal\n */\n public registerOption(option: ListOption): void {\n if (this.options.includes(option)) {\n return;\n }\n\n // Adding an option to the end, ultimately, isn't the correct\n // thing to do, as this will mean the option's index in the options,\n // at least temporarily, does not match the DOM order. However, it\n // is expected that a successive run of `slottedOptionsChanged` will\n // correct this order issue. See 'https://github.com/ni/nimble/issues/1915'\n // for more info.\n this.options.push(option);\n }\n\n protected override setSelectedOptions(): void {\n // Prevents parent classes from resetting selectedIndex to a positive\n // value while filtering, which can result in a disabled option being\n // selected.\n if (this.open && this.selectedIndex === -1) {\n return;\n }\n super.setSelectedOptions();\n }\n\n protected override focusAndScrollOptionIntoView(): void {\n if (this.open) {\n super.focusAndScrollOptionIntoView();\n window.requestAnimationFrame(() => {\n this.filterInput?.focus();\n });\n }\n }\n\n protected override getTypeaheadMatches(): ListboxOption[] {\n const matches = super.getTypeaheadMatches();\n // Don't allow placeholder to be matched\n return matches.filter(o => !o.hidden && !o.disabled);\n }\n\n protected positionChanged(\n _: SelectPosition | undefined,\n next: SelectPosition | undefined\n ): void {\n this.positionAttribute = next;\n this.setPositioning();\n }\n\n /**\n * Updates the proxy's size property when the size attribute changes.\n *\n * @param prev - the previous size\n * @param next - the current size\n *\n * @override\n * @internal\n */\n protected override sizeChanged(\n prev: number | undefined,\n next: number\n ): void {\n super.sizeChanged(prev, next);\n\n if (this.proxy) {\n this.proxy.size = next;\n }\n }\n\n protected openChanged(): void {\n if (!this.collapsible) {\n return;\n }\n\n if (this.open) {\n this.initializeOpenState();\n return;\n }\n\n const activeOption = this.options[this.openActiveIndex ?? this.selectedIndex];\n if (isListOption(activeOption)) {\n activeOption.activeOption = false;\n }\n this.openActiveIndex = undefined;\n this.filter = '';\n if (this.filterInput) {\n this.filterInput.value = '';\n }\n\n if (this.filterMode !== FilterMode.none) {\n this.emitFilterInputEvent();\n }\n this.ariaControls = '';\n this.ariaExpanded = 'false';\n }\n\n /**\n * Updates the selectedness of each option when the list of selected options changes.\n *\n * @param prev - the previous list of selected options\n * @param next - the current list of selected options\n *\n * @override\n * @internal\n */\n protected override selectedOptionsChanged(\n _prev: ListboxOption[] | undefined,\n next: ListboxOption[]\n ): void {\n // don't call super.selectedOptionsChanged so we don't filter out hidden elements\n // when updating 'selected' state (copied relevant super implementation)\n this.options?.forEach((o, i) => {\n const notifier = Observable.getNotifier(o);\n notifier.unsubscribe(this, 'selected');\n o.selected = next.includes(o);\n notifier.subscribe(this, 'selected');\n const proxyOption = this.proxy?.options.item(i);\n if (proxyOption) {\n proxyOption.selected = o.selected;\n }\n });\n }\n\n /**\n * Sets the selected index to match the first option with the selected attribute, or\n * the first selectable option.\n *\n * @override\n * @internal\n */\n protected override setDefaultSelectedOption(): void {\n const options: ListboxOption[] = this.options\n ?? Array.from(this.children).filter(o => isListOption(o));\n\n const optionIsSelected = (option: ListboxOption): boolean => {\n return option.hasAttribute('selected') || option.selected;\n };\n let selectedIndex = -1;\n let firstValidOptionIndex = -1;\n let placeholderIndex = -1;\n for (let i = 0; i < options?.length; i++) {\n const option = options[i]!;\n if (optionIsSelected(option) || option.value === this.value) {\n selectedIndex = i;\n break;\n } else if (placeholderIndex === -1 && isOptionPlaceholder(option)) {\n placeholderIndex = i;\n } else if (\n firstValidOptionIndex === -1\n && isOptionSelectable(option as ListOption)\n ) {\n firstValidOptionIndex = i;\n }\n }\n\n if (selectedIndex !== -1) {\n this.selectedIndex = selectedIndex;\n } else if (placeholderIndex !== -1) {\n this.selectedIndex = placeholderIndex;\n } else if (firstValidOptionIndex !== -1) {\n this.selectedIndex = firstValidOptionIndex;\n } else {\n this.selectedIndex = 0;\n }\n }\n\n private getSlottedOptions(\n slottedElements: Element[] | undefined\n ): ListboxOption[] {\n const options: ListOption[] = [];\n slottedElements?.forEach(el => {\n if (isListOption(el)) {\n options.push(el);\n } else if (isListOptionGroup(el)) {\n options.push(...this.getGroupOptions(el));\n }\n });\n\n return options;\n }\n\n private setActiveOption(newActiveIndex: number): void {\n const activeOption = this.options[newActiveIndex];\n if (this.open) {\n if (isListOption(activeOption)) {\n activeOption.activeOption = true;\n }\n\n const previousActiveIndex = this.openActiveIndex ?? this.selectedIndex;\n const previousActiveOption = this.options[previousActiveIndex];\n if (\n previousActiveIndex !== newActiveIndex\n && isListOption(previousActiveOption)\n ) {\n previousActiveOption.activeOption = false;\n }\n\n this.openActiveIndex = newActiveIndex;\n this.focusAndScrollActiveOptionIntoView();\n } else {\n this.selectedIndex = newActiveIndex;\n }\n\n this.ariaActiveDescendant = activeOption?.id ?? '';\n }\n\n private focusAndScrollActiveOptionIntoView(): void {\n const optionToFocus = this.options[this.openActiveIndex ?? this.selectedIndex];\n // Copied from FAST: To ensure that the browser handles both `focus()` and\n // `scrollIntoView()`, the timing here needs to guarantee that they happen on\n // different frames. Since this function is typically called from the `openChanged`\n // observer, `DOM.queueUpdate` causes the calls to be grouped into the same frame.\n // To prevent this, `requestAnimationFrame` is used instead of `DOM.queueUpdate`.\n if (optionToFocus !== undefined && this.contains(optionToFocus)) {\n optionToFocus.focus();\n requestAnimationFrame(() => {\n optionToFocus.scrollIntoView({ block: 'nearest' });\n });\n }\n }\n\n private getPlaceholderOption(): ListOption | undefined {\n return this.options.find(o => o.hidden && o.disabled) as ListOption;\n }\n\n private setPositioning(): void {\n if (!this.$fastController.isConnected) {\n // Don't call setPositioning() until we're connected,\n // since this.forcedPosition isn't initialized yet.\n return;\n }\n const currentBox = this.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const availableBottom = viewportHeight - currentBox.bottom;\n\n if (this.forcedPosition) {\n this.position = this.positionAttribute;\n } else if (currentBox.top > availableBottom) {\n this.position = SelectPosition.above;\n } else {\n this.position = SelectPosition.below;\n }\n\n this.positionAttribute = this.forcedPosition\n ? this.positionAttribute\n : this.position;\n\n this.availableViewportHeight = this.position === SelectPosition.above\n ? Math.trunc(currentBox.top)\n : Math.trunc(availableBottom);\n }\n\n private updateAdjacentSeparatorState(\n element: ListOptionGroup | ListOption\n ): void {\n const previousElement = this.getPreviousVisibleOptionOrGroup(element);\n const nextElement = this.getNextVisibleOptionOrGroup(element);\n\n if (isOptionOrGroupVisible(element)) {\n const topSeparatorVisible = isListOption(previousElement);\n this.setTopSeparatorState(element, topSeparatorVisible);\n const bottomSeparatorVisible = nextElement !== null;\n this.setBottomSeparatorState(element, bottomSeparatorVisible);\n this.setBottomSeparatorState(previousElement, true);\n } else {\n const nextTopSeparatorVisible = isListOption(previousElement);\n this.setTopSeparatorState(nextElement, nextTopSeparatorVisible);\n const previousBottomSeparatorVisible = nextElement !== null;\n this.setBottomSeparatorState(\n previousElement,\n previousBottomSeparatorVisible\n );\n }\n }\n\n private setTopSeparatorState(\n element: ListOptionGroup | ListOption | null,\n visible: boolean\n ): void {\n if (isListOptionGroup(element)) {\n element.topSeparatorVisible = visible;\n }\n }\n\n private setBottomSeparatorState(\n element: ListOptionGroup | ListOption | null,\n visible: boolean\n ): void {\n if (isListOptionGroup(element)) {\n element.bottomSeparatorVisible = visible;\n }\n }\n\n private getPreviousVisibleOptionOrGroup(\n element: HTMLElement\n ): ListOption | ListOptionGroup | null {\n let previousElement = element.previousElementSibling;\n while (previousElement) {\n if (\n (isListOption(previousElement)\n || isListOptionGroup(previousElement))\n && isOptionOrGroupVisible(previousElement)\n ) {\n return previousElement;\n }\n previousElement = previousElement.previousElementSibling;\n }\n return null;\n }\n\n private getNextVisibleOptionOrGroup(\n element: HTMLElement\n ): ListOption | ListOptionGroup | null {\n let nextElement = element.nextElementSibling;\n while (nextElement) {\n if (\n (isListOption(nextElement) || isListOptionGroup(nextElement))\n && isOptionOrGroupVisible(nextElement)\n ) {\n return nextElement;\n }\n nextElement = nextElement.nextElementSibling;\n }\n return null;\n }\n\n private isOptionHiddenOrFilteredOut(option: ListOption): boolean {\n if (option.hidden) {\n return true;\n }\n return this.filterMode === FilterMode.standard\n ? !this.filterMatchesText(option.text)\n : false;\n }\n\n private filterMatchesText(text: string): boolean {\n const filter = this.filter.toLowerCase();\n const normalizedFilter = diacriticInsensitiveStringNormalizer(filter);\n return diacriticInsensitiveStringNormalizer(text).includes(\n normalizedFilter\n );\n }\n\n /**\n * Filter available options by text value.\n *\n * @public\n */\n private filterOptions(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n\n const filteredOptions: ListOption[] = [];\n for (const element of this.slottedOptions) {\n if (isListOptionGroup(element)) {\n if (element.hidden) {\n continue; // no need to process hidden groups\n }\n const groupOptions = this.getGroupOptions(element);\n const groupMatchesFilter = this.filterMatchesText(\n element.labelContent\n );\n groupOptions.forEach(option => {\n option.visuallyHidden = groupMatchesFilter\n ? false\n : this.isOptionHiddenOrFilteredOut(option);\n if (!option.visuallyHidden) {\n filteredOptions.push(option);\n }\n });\n } else if (isListOption(element)) {\n element.visuallyHidden = this.isOptionHiddenOrFilteredOut(element);\n if (!element.visuallyHidden) {\n filteredOptions.push(element);\n }\n }\n }\n\n this.filteredOptions = filteredOptions;\n }\n\n private getGroupOptions(group: ListOptionGroup): ListOption[] {\n return Array.from(group.children)\n .filter(el => isListOption(el))\n .map(el => {\n if (group.hidden && isListOption(el)) {\n el.visuallyHidden = true;\n }\n\n return el;\n }) as ListOption[];\n }\n\n /**\n * Sets the value and display value to match the first selected option.\n *\n * @param shouldEmit - if true, the input and change events will be emitted\n *\n * @internal\n */\n private updateValue(shouldEmit?: boolean): void {\n if (this.$fastController.isConnected) {\n this.value = this.firstSelectedOption?.value ?? '';\n }\n\n if (shouldEmit) {\n this.$emit('input');\n this.$emit('change', this, {\n bubbles: true,\n composed: undefined\n });\n }\n }\n\n private clearSelect(): void {\n const placeholder = this.getPlaceholderOption();\n this.selectedIndex = placeholder\n ? this.options.indexOf(placeholder)\n : -1;\n }\n\n /**\n * Resets and fills the proxy to match the component's options.\n *\n * @internal\n */\n private setProxyOptions(): void {\n if (this.proxy instanceof HTMLSelectElement && this.options) {\n this.proxy.options.length = 0;\n this.options.forEach(option => {\n const proxyOption = option.proxy\n || (option instanceof HTMLOptionElement\n ? option.cloneNode()\n : null);\n\n if (proxyOption) {\n this.proxy.options.add(proxyOption);\n }\n });\n }\n }\n\n private filterChanged(): void {\n this.filterOptions();\n }\n\n private emitFilterInputEvent(): void {\n const eventDetail: SelectFilterInputEventDetail = {\n filterText: this.filter\n };\n\n this.$emit('filter-input', eventDetail, { bubbles: true });\n }\n\n private initializeOpenState(): void {\n this.setActiveOption(this.selectedIndex);\n this.ariaControls = this.listboxId;\n this.ariaExpanded = 'true';\n\n this.setPositioning();\n this.focusAndScrollOptionIntoView();\n }\n}\n\nconst nimbleSelect = Select.compose<SelectOptions>({\n baseName: 'select',\n baseClass: FoundationSelect,\n template,\n styles,\n indicator: arrowExpanderDown16X16.data,\n end: html<Select>`\n <${iconExclamationMarkTag}\n severity=\"error\"\n class=\"error-icon\"\n ></${iconExclamationMarkTag}>\n ${errorTextTemplate}\n `\n});\n\napplyMixins(Select, StartEnd, DelegatesARIASelect);\nDesignSystem.getOrCreate().withPrefix('nimble').register(nimbleSelect());\nexport const selectTag = 'nimble-select';\n"]}
|