@anglr/select 17.2.0 → 17.3.1-beta.20261108092016
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/changelog.md +13 -0
- package/es2022/src/directives/selectEdit/selectEdit.directive.js +1 -0
- package/es2022/src/directives/selectEdit/selectEdit.directive.js.map +1 -1
- package/es2022/src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.js.map +1 -1
- package/es2022/src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.js +2 -1
- package/es2022/src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +752 -222
- package/src/directives/selectEdit/selectEdit.directive.d.ts.map +1 -1
- package/src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.d.ts +4 -0
- package/src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.d.ts.map +1 -1
- package/src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.d.ts.map +1 -1
- package/version.bak +1 -1
package/changelog.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Version 17.3.0 (2026-09-22)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- fixed `SelectEdit` directive
|
|
8
|
+
- now properly unblocks *space* character when select is editable, so space could be written as input
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
- updated `SimpleKeyboardHandlerOptions` interface
|
|
13
|
+
- **new properties**
|
|
14
|
+
- `openPopupOnSpace` indication whether space key should trigger opening select popup
|
|
15
|
+
|
|
3
16
|
## Version 17.2.0 (2026-08-04)
|
|
4
17
|
|
|
5
18
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectEdit.directive.js","sourceRoot":"","sources":["../../../../src/directives/selectEdit/selectEdit.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAC,MAAM,EAAC,MAAM,0CAA0C,CAAC;;;AAGhE;;GAEG;AAUH,MAAM,OAAO,UAAU;IAEnB,iEAAiE;IACjE,YAAY,MAAoC;QAE5C,MAAM,CAAC,aAAa;YACpB;gBACI,OAAO,EACP;oBACI,eAAe,EACf;wBACI,OAAO,EACP;4BACI,kBAAkB,EAAE,KAAK;4BACzB,gBAAgB,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"selectEdit.directive.js","sourceRoot":"","sources":["../../../../src/directives/selectEdit/selectEdit.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAC,MAAM,EAAC,MAAM,0CAA0C,CAAC;;;AAGhE;;GAEG;AAUH,MAAM,OAAO,UAAU;IAEnB,iEAAiE;IACjE,YAAY,MAAoC;QAE5C,MAAM,CAAC,aAAa;YACpB;gBACI,OAAO,EACP;oBACI,eAAe,EACf;wBACI,OAAO,EACP;4BACI,kBAAkB,EAAE,KAAK;4BACzB,gBAAgB,EAAE,IAAI;4BACtB,gBAAgB,EAAE,KAAK;yBAC1B;qBACJ;iBACJ;aACmC,CAAC;IAC7C,CAAC;8GApBQ,UAAU;kGAAV,UAAU,8DALnB;YACI,sBAAsB,CAAC,eAAe,CAAC;YACvC,qBAAqB,CAAC,cAAc,CAAC;SACxC;;2FAEQ,UAAU;kBATtB,SAAS;mBACV;oBACI,QAAQ,EAAE,iBAAiB;oBAC3B,SAAS,EACT;wBACI,sBAAsB,CAAC,eAAe,CAAC;wBACvC,qBAAqB,CAAC,cAAc,CAAC;qBACxC;iBACJ","sourcesContent":["import {Directive} from '@angular/core';\nimport {RecursivePartial} from '@jscrpt/common';\n\nimport {provideLiveSearchType, provideNormalStateType} from '../../misc/providers';\nimport {EditLiveSearch, EditNormalState} from '../../plugins';\nimport {Select} from '../../components/select/select.component';\nimport {SelectOptions, SimpleKeyboardHandlerOptions} from '../../interfaces';\n\n/**\n * Directive that applies options for Select which switch it to edit mode.\n */\n@Directive(\n{\n selector: 'ng-select[edit]',\n providers:\n [\n provideNormalStateType(EditNormalState),\n provideLiveSearchType(EditLiveSearch),\n ],\n})\nexport class SelectEdit<TValue = unknown, TPublicValue = TValue>\n{\n //######################### constructor #########################\n constructor(select: Select<TValue, TPublicValue>)\n {\n select.selectOptions =\n {\n plugins:\n {\n keyboardHandler:\n {\n options: <RecursivePartial<SimpleKeyboardHandlerOptions>>\n {\n alphanumericSearch: false,\n liveSearchEvents: true,\n openPopupOnSpace: false,\n },\n },\n },\n } as SelectOptions<TValue, TPublicValue>;\n }\n}\n"]}
|
package/es2022/src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simpleKeyboardHandler.interface.js","sourceRoot":"","sources":["../../../../../src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {KeyboardHandlerOptions} from './keyboardHandler.interface';\n\n/**\n * Options for simple keyboard handler plugin\n */\nexport interface SimpleKeyboardHandlerOptions extends KeyboardHandlerOptions\n{\n //######################### properties #########################\n\n /**\n * Debounce timeout for selecting first option when typing\n */\n selectFirstDebounceTimeout: number;\n\n /**\n * Indication whether is alphanumeric search enabled, meaning that when user types alphanumeric keys (outside of live search), select will try to find option starting with searched text and select it\n */\n alphanumericSearch: boolean;\n\n /**\n * Indication whether live search events should be processed\n */\n liveSearchEvents: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"simpleKeyboardHandler.interface.js","sourceRoot":"","sources":["../../../../../src/interfaces/plugins/keyboardHandler/simpleKeyboardHandler.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {KeyboardHandlerOptions} from './keyboardHandler.interface';\n\n/**\n * Options for simple keyboard handler plugin\n */\nexport interface SimpleKeyboardHandlerOptions extends KeyboardHandlerOptions\n{\n //######################### properties #########################\n\n /**\n * Debounce timeout for selecting first option when typing\n */\n selectFirstDebounceTimeout: number;\n\n /**\n * Indication whether is alphanumeric search enabled, meaning that when user types alphanumeric keys (outside of live search), select will try to find option starting with searched text and select it\n */\n alphanumericSearch: boolean;\n\n /**\n * Indication whether space key should trigger opening select popup\n */\n openPopupOnSpace: boolean;\n\n /**\n * Indication whether live search events should be processed\n */\n liveSearchEvents: boolean;\n}\n"]}
|
package/es2022/src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.js
CHANGED
|
@@ -9,6 +9,7 @@ import { KEYBOARD_HANDLER_OPTIONS } from '../../../misc/tokens';
|
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
const defaultOptions = {
|
|
11
11
|
selectFirstDebounceTimeout: 300,
|
|
12
|
+
openPopupOnSpace: true,
|
|
12
13
|
alphanumericSearch: true,
|
|
13
14
|
liveSearchEvents: false,
|
|
14
15
|
};
|
|
@@ -141,7 +142,7 @@ export class SimpleKeyboardHandler {
|
|
|
141
142
|
data: null,
|
|
142
143
|
});
|
|
143
144
|
}
|
|
144
|
-
if (event.key == ' ') {
|
|
145
|
+
if (this.options.openPopupOnSpace && event.key == ' ') {
|
|
145
146
|
this.logger.verbose('Select: Keyboard handler: handling Space');
|
|
146
147
|
this.selectBus.showPopup.next({
|
|
147
148
|
source: this,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simpleKeyboardHandler.component.js","sourceRoot":"","sources":["../../../../../src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {Component, effect, ElementRef, Inject, inject, OnDestroy, Optional} from '@angular/core';\nimport {LOGGER, Logger} from '@anglr/common';\nimport {BindThis, isPresent, RecursivePartial} from '@jscrpt/common';\nimport {deepCopyWithArrayOverride} from '@jscrpt/common/lodash';\n\nimport {KeyboardHandler, SimpleKeyboardHandlerOptions, SelectFirstKeyboardAction, SelectPlugin, SelectActiveKeyboardAction, RemoveLastSelectedValueKeyboardAction} from '../../../interfaces';\nimport {SelectPluginInstances, SelectBus} from '../../../misc/classes';\nimport {CopyOptionsAsSignal} from '../../../decorators';\nimport {KEYBOARD_HANDLER_OPTIONS} from '../../../misc/tokens';\nimport {SimpleKeyboardActionTypes} from '../../../misc/types';\n\nconst defaultOptions: SimpleKeyboardHandlerOptions =\n{\n selectFirstDebounceTimeout: 300,\n alphanumericSearch: true,\n liveSearchEvents: false,\n};\n\n/**\n * Simple keyboard handler, handling basic keyboard actions\n */\n@Component(\n{\n selector: 'simple-keyboard-handler',\n template: '',\n})\nexport class SimpleKeyboardHandler<TValue = unknown, TPublicValue = TValue> implements KeyboardHandler<TValue, TPublicValue, SimpleKeyboardHandlerOptions, SimpleKeyboardActionTypes>, OnDestroy\n{\n //######################### protected fields #########################\n\n /**\n * Searched text\n */\n protected search: string = '';\n\n /**\n * Debounce timeout for search\n */\n protected searchDebounceTimeout: number|undefined|null;\n\n /**\n * Instance of logger for logging purposes\n */\n protected logger: Logger = inject(LOGGER);\n\n //######################### public properties - implementation of SelectPlugin #########################\n\n /**\n * @inheritdoc\n */\n @CopyOptionsAsSignal()\n public options: SimpleKeyboardHandlerOptions;\n\n /**\n * @inheritdoc\n */\n public selectPlugins: SelectPluginInstances<TValue, TPublicValue> = inject(SelectPluginInstances);\n\n /**\n * @inheritdoc\n */\n public pluginElement: ElementRef<HTMLElement> = inject(ElementRef);\n\n /**\n * @inheritdoc\n */\n public selectBus: SelectBus<TValue, TPublicValue, SimpleKeyboardActionTypes> = inject(SelectBus) as SelectBus<TValue, TPublicValue, SimpleKeyboardActionTypes>;\n\n //######################### constructor #########################\n constructor(@Inject(KEYBOARD_HANDLER_OPTIONS) @Optional() options?: RecursivePartial<SimpleKeyboardHandlerOptions>|null,)\n {\n this.options = deepCopyWithArrayOverride(defaultOptions as SimpleKeyboardHandlerOptions,\n options);\n\n effect(() =>\n {\n this.logger.verbose('Select: Keyboard handler: registering keyboard \"keydown\" event listener');\n\n this.selectBus.selectElement().nativeElement.removeEventListener('keydown', this.handleKeyboardEvents);\n this.selectBus.selectElement().nativeElement.addEventListener('keydown', this.handleKeyboardEvents);\n });\n\n effect(() =>\n {\n const liveSearch = this.selectPlugins.liveSearch();\n\n if(this.options.liveSearchEvents && liveSearch)\n {\n liveSearch.pluginElement.nativeElement.removeEventListener('keydown', this.handleLiveSearchKeyboardEvents);\n liveSearch.pluginElement.nativeElement.addEventListener('keydown', this.handleLiveSearchKeyboardEvents);\n }\n });\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n\n /**\n * @inheritdoc\n */\n public ngOnDestroy(): void\n {\n this.logger.verbose('Select: Keyboard handler: destroying, removing keyboard \"keydown\" event listener, clearing search debounce timeout');\n this.selectBus.selectElement().nativeElement.removeEventListener('keydown', this.handleKeyboardEvents);\n\n if(isPresent(this.searchDebounceTimeout))\n {\n clearTimeout(this.searchDebounceTimeout);\n }\n }\n\n //######################### protected methods #########################\n\n /**\n * Handles live search keyboard events\n * @param event - Keyboard event that occured\n */\n @BindThis\n protected handleLiveSearchKeyboardEvents(event: KeyboardEvent): void\n {\n if(event.key == 'Backspace' && this.selectPlugins.liveSearch()?.emptyInput())\n {\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <RemoveLastSelectedValueKeyboardAction>{type: 'REMOVE_LAST_SELECTED_VALUE'},\n });\n }\n }\n\n /**\n * Handles keyboard events\n * @param event - Keyboard event that occured\n */\n @BindThis\n protected handleKeyboardEvents(event: KeyboardEvent): void\n {\n const options = this.selectPlugins.OptionsHandler.listOptions();\n\n if(event.key == 'ArrowDown' || event.key == 'ArrowUp')\n {\n const activeOption = options?.find(itm => itm.active());\n this.logger.verbose('Select: Keyboard handler: handling ArrowDown, ArrowUp');\n\n if(activeOption && options)\n {\n let index = options.indexOf(activeOption);\n\n //move down cursor\n if(event.key == 'ArrowDown')\n {\n index += 1;\n }\n //move up cursor\n else\n {\n index -= 1;\n }\n\n if(index < 0)\n {\n index = options.length - 1;\n }\n\n index = index % options.length;\n\n this.logger.verbose('Select: Keyboard handler: selecting option with index {{index}}', {index});\n\n this.selectBus.markOption.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: options[index],\n });\n }\n //none active before\n else if(options?.length)\n {\n this.logger.verbose('Select: Keyboard handler: selecting option with index {{index}}', {index: 0});\n\n this.selectBus.markOption.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: options[0],\n });\n }\n\n event.preventDefault();\n }\n\n //prevent enter if popup is opened\n if(event.key == 'Enter' && this.selectBus.popupVisible())\n {\n const activeOption = options?.find(itm => itm.active());\n this.logger.verbose('Select: Keyboard handler: handling Enter');\n\n if(activeOption)\n {\n this.logger.verbose('Select: Keyboard handler: selecting active option');\n\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <SelectActiveKeyboardAction>{type: 'SELECT_ACTIVE'},\n });\n }\n\n event.preventDefault();\n }\n\n if(event.key == 'Tab' || event.key == 'Escape')\n {\n this.logger.verbose('Select: Keyboard handler: handling Tab, Escape');\n\n this.selectBus.hidePopup.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: null,\n });\n }\n\n if(event.key == ' ')\n {\n this.logger.verbose('Select: Keyboard handler: handling Space');\n\n this.selectBus.showPopup.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: null,\n });\n\n event.preventDefault();\n }\n\n if(this.options.alphanumericSearch && event.key.match(/^[a-z0-9]$/i))\n {\n this.logger.verbose('Select: Keyboard handler: handling alphanumeric key');\n\n this.search += event.key;\n\n if(isPresent(this.searchDebounceTimeout))\n {\n clearTimeout(this.searchDebounceTimeout);\n }\n\n this.searchDebounceTimeout = setTimeout(() =>\n {\n this.logger.verbose('Select: Keyboard handler: seinding SELECT_FIRST keyboard action with search \"{{search}}\"', {search: this.search});\n\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <SelectFirstKeyboardAction>{type: 'SELECT_FIRST', search: this.search},\n });\n\n this.search = '';\n }, this.options.selectFirstDebounceTimeout) as unknown as number;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"simpleKeyboardHandler.component.js","sourceRoot":"","sources":["../../../../../src/plugins/keyboardHandler/simpleKeyboardHandler/simpleKeyboardHandler.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {Component, effect, ElementRef, Inject, inject, OnDestroy, Optional} from '@angular/core';\nimport {LOGGER, Logger} from '@anglr/common';\nimport {BindThis, isPresent, RecursivePartial} from '@jscrpt/common';\nimport {deepCopyWithArrayOverride} from '@jscrpt/common/lodash';\n\nimport {KeyboardHandler, SimpleKeyboardHandlerOptions, SelectFirstKeyboardAction, SelectPlugin, SelectActiveKeyboardAction, RemoveLastSelectedValueKeyboardAction} from '../../../interfaces';\nimport {SelectPluginInstances, SelectBus} from '../../../misc/classes';\nimport {CopyOptionsAsSignal} from '../../../decorators';\nimport {KEYBOARD_HANDLER_OPTIONS} from '../../../misc/tokens';\nimport {SimpleKeyboardActionTypes} from '../../../misc/types';\n\nconst defaultOptions: SimpleKeyboardHandlerOptions =\n{\n selectFirstDebounceTimeout: 300,\n openPopupOnSpace: true,\n alphanumericSearch: true,\n liveSearchEvents: false,\n};\n\n/**\n * Simple keyboard handler, handling basic keyboard actions\n */\n@Component(\n{\n selector: 'simple-keyboard-handler',\n template: '',\n})\nexport class SimpleKeyboardHandler<TValue = unknown, TPublicValue = TValue> implements KeyboardHandler<TValue, TPublicValue, SimpleKeyboardHandlerOptions, SimpleKeyboardActionTypes>, OnDestroy\n{\n //######################### protected fields #########################\n\n /**\n * Searched text\n */\n protected search: string = '';\n\n /**\n * Debounce timeout for search\n */\n protected searchDebounceTimeout: number|undefined|null;\n\n /**\n * Instance of logger for logging purposes\n */\n protected logger: Logger = inject(LOGGER);\n\n //######################### public properties - implementation of SelectPlugin #########################\n\n /**\n * @inheritdoc\n */\n @CopyOptionsAsSignal()\n public options: SimpleKeyboardHandlerOptions;\n\n /**\n * @inheritdoc\n */\n public selectPlugins: SelectPluginInstances<TValue, TPublicValue> = inject(SelectPluginInstances);\n\n /**\n * @inheritdoc\n */\n public pluginElement: ElementRef<HTMLElement> = inject(ElementRef);\n\n /**\n * @inheritdoc\n */\n public selectBus: SelectBus<TValue, TPublicValue, SimpleKeyboardActionTypes> = inject(SelectBus) as SelectBus<TValue, TPublicValue, SimpleKeyboardActionTypes>;\n\n //######################### constructor #########################\n constructor(@Inject(KEYBOARD_HANDLER_OPTIONS) @Optional() options?: RecursivePartial<SimpleKeyboardHandlerOptions>|null,)\n {\n this.options = deepCopyWithArrayOverride(defaultOptions as SimpleKeyboardHandlerOptions,\n options);\n\n effect(() =>\n {\n this.logger.verbose('Select: Keyboard handler: registering keyboard \"keydown\" event listener');\n\n this.selectBus.selectElement().nativeElement.removeEventListener('keydown', this.handleKeyboardEvents);\n this.selectBus.selectElement().nativeElement.addEventListener('keydown', this.handleKeyboardEvents);\n });\n\n effect(() =>\n {\n const liveSearch = this.selectPlugins.liveSearch();\n\n if(this.options.liveSearchEvents && liveSearch)\n {\n liveSearch.pluginElement.nativeElement.removeEventListener('keydown', this.handleLiveSearchKeyboardEvents);\n liveSearch.pluginElement.nativeElement.addEventListener('keydown', this.handleLiveSearchKeyboardEvents);\n }\n });\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n\n /**\n * @inheritdoc\n */\n public ngOnDestroy(): void\n {\n this.logger.verbose('Select: Keyboard handler: destroying, removing keyboard \"keydown\" event listener, clearing search debounce timeout');\n this.selectBus.selectElement().nativeElement.removeEventListener('keydown', this.handleKeyboardEvents);\n\n if(isPresent(this.searchDebounceTimeout))\n {\n clearTimeout(this.searchDebounceTimeout);\n }\n }\n\n //######################### protected methods #########################\n\n /**\n * Handles live search keyboard events\n * @param event - Keyboard event that occured\n */\n @BindThis\n protected handleLiveSearchKeyboardEvents(event: KeyboardEvent): void\n {\n if(event.key == 'Backspace' && this.selectPlugins.liveSearch()?.emptyInput())\n {\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <RemoveLastSelectedValueKeyboardAction>{type: 'REMOVE_LAST_SELECTED_VALUE'},\n });\n }\n }\n\n /**\n * Handles keyboard events\n * @param event - Keyboard event that occured\n */\n @BindThis\n protected handleKeyboardEvents(event: KeyboardEvent): void\n {\n const options = this.selectPlugins.OptionsHandler.listOptions();\n\n if(event.key == 'ArrowDown' || event.key == 'ArrowUp')\n {\n const activeOption = options?.find(itm => itm.active());\n this.logger.verbose('Select: Keyboard handler: handling ArrowDown, ArrowUp');\n\n if(activeOption && options)\n {\n let index = options.indexOf(activeOption);\n\n //move down cursor\n if(event.key == 'ArrowDown')\n {\n index += 1;\n }\n //move up cursor\n else\n {\n index -= 1;\n }\n\n if(index < 0)\n {\n index = options.length - 1;\n }\n\n index = index % options.length;\n\n this.logger.verbose('Select: Keyboard handler: selecting option with index {{index}}', {index});\n\n this.selectBus.markOption.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: options[index],\n });\n }\n //none active before\n else if(options?.length)\n {\n this.logger.verbose('Select: Keyboard handler: selecting option with index {{index}}', {index: 0});\n\n this.selectBus.markOption.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: options[0],\n });\n }\n\n event.preventDefault();\n }\n\n //prevent enter if popup is opened\n if(event.key == 'Enter' && this.selectBus.popupVisible())\n {\n const activeOption = options?.find(itm => itm.active());\n this.logger.verbose('Select: Keyboard handler: handling Enter');\n\n if(activeOption)\n {\n this.logger.verbose('Select: Keyboard handler: selecting active option');\n\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <SelectActiveKeyboardAction>{type: 'SELECT_ACTIVE'},\n });\n }\n\n event.preventDefault();\n }\n\n if(event.key == 'Tab' || event.key == 'Escape')\n {\n this.logger.verbose('Select: Keyboard handler: handling Tab, Escape');\n\n this.selectBus.hidePopup.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: null,\n });\n }\n\n if(this.options.openPopupOnSpace && event.key == ' ')\n {\n this.logger.verbose('Select: Keyboard handler: handling Space');\n\n this.selectBus.showPopup.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: null,\n });\n\n event.preventDefault();\n }\n\n if(this.options.alphanumericSearch && event.key.match(/^[a-z0-9]$/i))\n {\n this.logger.verbose('Select: Keyboard handler: handling alphanumeric key');\n\n this.search += event.key;\n\n if(isPresent(this.searchDebounceTimeout))\n {\n clearTimeout(this.searchDebounceTimeout);\n }\n\n this.searchDebounceTimeout = setTimeout(() =>\n {\n this.logger.verbose('Select: Keyboard handler: seinding SELECT_FIRST keyboard action with search \"{{search}}\"', {search: this.search});\n\n this.selectBus.keyboardAction.next(\n {\n source: this as SelectPlugin,\n sourceElement: this.selectBus.selectElement().nativeElement,\n data: <SelectFirstKeyboardAction>{type: 'SELECT_FIRST', search: this.search},\n });\n\n this.search = '';\n }, this.options.selectFirstDebounceTimeout) as unknown as number;\n }\n }\n}\n"]}
|