UNPKG

@angular/cdk

Version:

Angular Material Component Development Kit

1 lines 7.78 kB
{"version":3,"file":"_typeahead-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/a11y/key-manager/typeahead.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {A, NINE, Z, ZERO} from '../../keycodes';\nimport {Subject, Observable} from 'rxjs';\nimport {debounceTime, filter, map, tap} from 'rxjs/operators';\n\nconst DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS = 200;\n\ninterface TypeaheadItem {\n getLabel?(): string;\n}\n\ninterface TypeaheadConfig<T> {\n debounceInterval?: number;\n skipPredicate?: (item: T) => boolean | undefined;\n}\n\n/**\n * Selects items based on keyboard inputs. Implements the typeahead functionality of\n * `role=\"listbox\"` or `role=\"tree\"` and other related roles.\n */\nexport class Typeahead<T extends TypeaheadItem> {\n private readonly _letterKeyStream = new Subject<string>();\n private _items: readonly T[] = [];\n private _selectedItemIndex = -1;\n\n /** Buffer for the letters that the user has pressed */\n private _pressedLetters: string[] = [];\n\n private _skipPredicateFn?: (item: T) => boolean | undefined;\n\n private readonly _selectedItem = new Subject<T>();\n readonly selectedItem: Observable<T> = this._selectedItem;\n\n constructor(initialItems: readonly T[], config?: TypeaheadConfig<T>) {\n const typeAheadInterval =\n typeof config?.debounceInterval === 'number'\n ? config.debounceInterval\n : DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS;\n\n if (config?.skipPredicate) {\n this._skipPredicateFn = config.skipPredicate;\n }\n\n if (\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n initialItems.length &&\n initialItems.some(item => typeof item.getLabel !== 'function')\n ) {\n throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');\n }\n\n this.setItems(initialItems);\n this._setupKeyHandler(typeAheadInterval);\n }\n\n destroy() {\n this._pressedLetters = [];\n this._letterKeyStream.complete();\n this._selectedItem.complete();\n }\n\n setCurrentSelectedItemIndex(index: number) {\n this._selectedItemIndex = index;\n }\n\n setItems(items: readonly T[]) {\n this._items = items;\n }\n\n handleKey(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n\n // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n // otherwise fall back to resolving alphanumeric characters via the keyCode.\n if (event.key && event.key.length === 1) {\n this._letterKeyStream.next(event.key.toLocaleUpperCase());\n } else if ((keyCode >= A && keyCode <= Z) || (keyCode >= ZERO && keyCode <= NINE)) {\n this._letterKeyStream.next(String.fromCharCode(keyCode));\n }\n }\n\n /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n isTyping(): boolean {\n return this._pressedLetters.length > 0;\n }\n\n /** Resets the currently stored sequence of typed letters. */\n reset(): void {\n this._pressedLetters = [];\n }\n\n private _setupKeyHandler(typeAheadInterval: number) {\n // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n // and convert those letters back into a string. Afterwards find the first item that starts\n // with that string and select it.\n this._letterKeyStream\n .pipe(\n tap(letter => this._pressedLetters.push(letter)),\n debounceTime(typeAheadInterval),\n filter(() => this._pressedLetters.length > 0),\n map(() => this._pressedLetters.join('').toLocaleUpperCase()),\n )\n .subscribe(inputString => {\n // Start at 1 because we want to start searching at the item immediately\n // following the current active item.\n for (let i = 1; i < this._items.length + 1; i++) {\n const index = (this._selectedItemIndex + i) % this._items.length;\n const item = this._items[index];\n\n if (\n !this._skipPredicateFn?.(item) &&\n item.getLabel?.().toLocaleUpperCase().trim().indexOf(inputString) === 0\n ) {\n this._selectedItem.next(item);\n break;\n }\n }\n\n this._pressedLetters = [];\n });\n }\n}\n"],"names":["DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS","Typeahead","_letterKeyStream","Subject","_items","_selectedItemIndex","_pressedLetters","_skipPredicateFn","_selectedItem","selectedItem","constructor","initialItems","config","typeAheadInterval","debounceInterval","skipPredicate","ngDevMode","length","some","item","getLabel","Error","setItems","_setupKeyHandler","destroy","complete","setCurrentSelectedItemIndex","index","items","handleKey","event","keyCode","key","next","toLocaleUpperCase","A","Z","ZERO","NINE","String","fromCharCode","isTyping","reset","pipe","tap","letter","push","debounceTime","filter","map","join","subscribe","inputString","i","trim","indexOf"],"mappings":";;;;AAYA,MAAMA,sCAAsC,GAAG,GAAG;MAerCC,SAAS,CAAA;AACHC,EAAAA,gBAAgB,GAAG,IAAIC,OAAO,EAAU;AACjDC,EAAAA,MAAM,GAAiB,EAAE;EACzBC,kBAAkB,GAAG,CAAC,CAAC;AAGvBC,EAAAA,eAAe,GAAa,EAAE;EAE9BC,gBAAgB;AAEPC,EAAAA,aAAa,GAAG,IAAIL,OAAO,EAAK;EACxCM,YAAY,GAAkB,IAAI,CAACD,aAAa;AAEzDE,EAAAA,WAAYA,CAAAC,YAA0B,EAAEC,MAA2B,EAAA;AACjE,IAAA,MAAMC,iBAAiB,GACrB,OAAOD,MAAM,EAAEE,gBAAgB,KAAK,QAAQ,GACxCF,MAAM,CAACE,gBAAgB,GACvBd,sCAAsC;IAE5C,IAAIY,MAAM,EAAEG,aAAa,EAAE;AACzB,MAAA,IAAI,CAACR,gBAAgB,GAAGK,MAAM,CAACG,aAAa;AAC9C;IAEA,IACE,CAAC,OAAOC,SAAS,KAAK,WAAW,IAAIA,SAAS,KAC9CL,YAAY,CAACM,MAAM,IACnBN,YAAY,CAACO,IAAI,CAACC,IAAI,IAAI,OAAOA,IAAI,CAACC,QAAQ,KAAK,UAAU,CAAC,EAC9D;AACA,MAAA,MAAM,IAAIC,KAAK,CAAC,0EAA0E,CAAC;AAC7F;AAEA,IAAA,IAAI,CAACC,QAAQ,CAACX,YAAY,CAAC;AAC3B,IAAA,IAAI,CAACY,gBAAgB,CAACV,iBAAiB,CAAC;AAC1C;AAEAW,EAAAA,OAAOA,GAAA;IACL,IAAI,CAAClB,eAAe,GAAG,EAAE;AACzB,IAAA,IAAI,CAACJ,gBAAgB,CAACuB,QAAQ,EAAE;AAChC,IAAA,IAAI,CAACjB,aAAa,CAACiB,QAAQ,EAAE;AAC/B;EAEAC,2BAA2BA,CAACC,KAAa,EAAA;IACvC,IAAI,CAACtB,kBAAkB,GAAGsB,KAAK;AACjC;EAEAL,QAAQA,CAACM,KAAmB,EAAA;IAC1B,IAAI,CAACxB,MAAM,GAAGwB,KAAK;AACrB;EAEAC,SAASA,CAACC,KAAoB,EAAA;AAC5B,IAAA,MAAMC,OAAO,GAAGD,KAAK,CAACC,OAAO;IAI7B,IAAID,KAAK,CAACE,GAAG,IAAIF,KAAK,CAACE,GAAG,CAACf,MAAM,KAAK,CAAC,EAAE;AACvC,MAAA,IAAI,CAACf,gBAAgB,CAAC+B,IAAI,CAACH,KAAK,CAACE,GAAG,CAACE,iBAAiB,EAAE,CAAC;AAC3D,KAAA,MAAO,IAAKH,OAAO,IAAII,CAAC,IAAIJ,OAAO,IAAIK,CAAC,IAAML,OAAO,IAAIM,IAAI,IAAIN,OAAO,IAAIO,IAAK,EAAE;MACjF,IAAI,CAACpC,gBAAgB,CAAC+B,IAAI,CAACM,MAAM,CAACC,YAAY,CAACT,OAAO,CAAC,CAAC;AAC1D;AACF;AAGAU,EAAAA,QAAQA,GAAA;AACN,IAAA,OAAO,IAAI,CAACnC,eAAe,CAACW,MAAM,GAAG,CAAC;AACxC;AAGAyB,EAAAA,KAAKA,GAAA;IACH,IAAI,CAACpC,eAAe,GAAG,EAAE;AAC3B;EAEQiB,gBAAgBA,CAACV,iBAAyB,EAAA;IAIhD,IAAI,CAACX,gBAAgB,CAClByC,IAAI,CACHC,GAAG,CAACC,MAAM,IAAI,IAAI,CAACvC,eAAe,CAACwC,IAAI,CAACD,MAAM,CAAC,CAAC,EAChDE,YAAY,CAAClC,iBAAiB,CAAC,EAC/BmC,MAAM,CAAC,MAAM,IAAI,CAAC1C,eAAe,CAACW,MAAM,GAAG,CAAC,CAAC,EAC7CgC,GAAG,CAAC,MAAM,IAAI,CAAC3C,eAAe,CAAC4C,IAAI,CAAC,EAAE,CAAC,CAAChB,iBAAiB,EAAE,CAAC,CAAA,CAE7DiB,SAAS,CAACC,WAAW,IAAG;AAGvB,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACjD,MAAM,CAACa,MAAM,GAAG,CAAC,EAAEoC,CAAC,EAAE,EAAE;AAC/C,QAAA,MAAM1B,KAAK,GAAG,CAAC,IAAI,CAACtB,kBAAkB,GAAGgD,CAAC,IAAI,IAAI,CAACjD,MAAM,CAACa,MAAM;AAChE,QAAA,MAAME,IAAI,GAAG,IAAI,CAACf,MAAM,CAACuB,KAAK,CAAC;AAE/B,QAAA,IACE,CAAC,IAAI,CAACpB,gBAAgB,GAAGY,IAAI,CAAC,IAC9BA,IAAI,CAACC,QAAQ,IAAI,CAACc,iBAAiB,EAAE,CAACoB,IAAI,EAAE,CAACC,OAAO,CAACH,WAAW,CAAC,KAAK,CAAC,EACvE;AACA,UAAA,IAAI,CAAC5C,aAAa,CAACyB,IAAI,CAACd,IAAI,CAAC;AAC7B,UAAA;AACF;AACF;MAEA,IAAI,CAACb,eAAe,GAAG,EAAE;AAC3B,KAAC,CAAC;AACN;AACD;;;;"}