{"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":"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"}