{"version":3,"file":"sinequa-components-autocomplete.mjs","sources":["../../../projects/components/autocomplete/bootstrap/autocomplete-list/autocomplete-list.ts","../../../projects/components/autocomplete/bootstrap/autocomplete-list/autocomplete-list.html","../../../projects/components/autocomplete/suggest.service.ts","../../../projects/components/autocomplete/autocomplete.directive.ts","../../../projects/components/autocomplete/bootstrap/autocomplete.module.ts","../../../projects/components/autocomplete/sinequa-components-autocomplete.ts"],"sourcesContent":["import {Output, ContentChild, TemplateRef, Component, EventEmitter, ChangeDetectorRef} from \"@angular/core\";\nimport {AutocompleteItem, AutocompleteComponent} from \"../../autocomplete.directive\";\n\n@Component({\n    selector: \"sq-autocomplete-list\",\n    templateUrl: \"./autocomplete-list.html\",\n    styleUrls: [\"./autocomplete-list.css\"],\n    standalone: false\n})\nexport class BsAutocompleteList implements AutocompleteComponent {\n\n    /**\n     * Template for the display of AutocompleteItem items, passed by transclusion\n     */\n    @ContentChild(\"itemTpl\", {static: false}) itemTpl: TemplateRef<any>;\n\n    /**\n     * Optional footer template, passed by transclusion\n     */\n    @ContentChild(\"footerTpl\", {static: false}) footerTpl: TemplateRef<any>;\n\n    /**\n     * Event emitter for clicks on an autocomplete item\n     */\n    @Output() clicked = new EventEmitter<AutocompleteItem>();\n\n    _active: boolean = false;\n    _items: AutocompleteItem[] | undefined;\n\n    _cursor: number = -1;\n\n\n    constructor(\n        private changeDetectorRef: ChangeDetectorRef){\n    }\n\n\n    /**\n     * Update the data and state of this component\n     * @param active whether the component should be displayed\n     * @param items The list of items to display\n     */\n    public update(active: boolean, items?: AutocompleteItem[]){\n        //console.log(\"autocomplete update \", active, items);\n        this._active = active;\n        this._items = items;\n        this._cursor = -1;\n\n        this.changeDetectorRef.markForCheck();\n    }\n\n    /**\n     * Whether there are any item to display\n     */\n    public get hasItems(): boolean {\n        return this._active && !!this._items && this._items.length > 0;\n    }\n\n    /**\n     * Returns the currently selected item, if any\n     */\n    public get selectedValue(): AutocompleteItem | undefined {\n        if(this._items && this._cursor >= 0 && this._cursor < this._items.length)\n            return this._items[this._cursor];\n        return undefined;\n    }\n\n    /**\n     * Select the next item in the list and returns it\n     */\n    public selectNext(): AutocompleteItem | undefined {\n        if (this._items && this._cursor < this._items.length-1) {\n            this._cursor++;\n        }\n        return this.selectedValue;\n    }\n\n    /**\n     * Select the previous item in the list and returns it\n     */\n    public selectPrevious(): AutocompleteItem | undefined {\n        if(this._cursor > 0)\n            this._cursor--;\n        return this.selectedValue;\n    }\n\n    /**\n     * Test whether an item is selected\n     * @param item\n     * @param i\n     */\n    _isSelected(item: AutocompleteItem, i: number): boolean {\n        return this._cursor === i;\n    }\n\n    /**\n     * Listen to click events and emits events\n     * @param item\n     * @param event\n     */\n    _itemClicked(item: AutocompleteItem, event){\n        this.clicked.next(item);\n        event.stopPropagation();\n        return false;\n    }\n\n    /**\n     * This prevents the focus to be removed from the <input>, which clauses the dropdown\n     */\n    _mouseDown(event){\n        event.preventDefault();\n    }\n\n}","<div class=\"sq-autocomplete-list card position-absolute\" *ngIf=\"hasItems\" (mousedown)=\"_mouseDown($event)\">\n    <div class=\"list-group list-group-flush\">\n        <a  href=\"#\" (click)=\"_itemClicked(item, $event)\"\n            *ngFor=\"let item of _items; let i = index\"\n            class=\"list-group-item list-group-item-action p-0 border-0\" \n            [ngClass]=\"{'list-group-item-primary': _isSelected(item, i)}\"\n            [sqScrollIntoView]=\"{active: _isSelected(item, i), first: i === 0}\">\n            <ng-container *ngIf=\"itemTpl\">\n                <ng-container *ngTemplateOutlet=\"itemTpl; context:{$implicit: item}\"></ng-container>\n            </ng-container>\n        </a>\n    </div>\n    <div class=\"card-footer\" *ngIf=\"footerTpl\">\n        <ng-container *ngTemplateOutlet=\"footerTpl; context:{$implicit: _items}\"></ng-container>\n    </div>\n</div>","import {Injectable} from \"@angular/core\";\nimport {map, Observable, of, switchMap, tap} from \"rxjs\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {SuggestQueryWebService, SuggestFieldWebService, Suggestion, EngineType} from \"@sinequa/core/web-services\";\nimport {AppService, Query} from \"@sinequa/core/app-utils\";\nimport {AutocompleteItem} from './autocomplete.directive';\n\nexport interface ScoredAutocompleteItem<T, Tcat extends string> extends AutocompleteItem {\n  score: number;\n  data: T;\n  category: Tcat;\n}\n\n@Injectable({\n    providedIn: \"root\"\n})\nexport class SuggestService {\n\n    constructor(\n        private suggestQueryWebService: SuggestQueryWebService,\n        private suggestFieldWebService: SuggestFieldWebService,\n        private appService: AppService) {\n    }\n\n    get(suggestQuery: string | undefined, text: string, fields?: string | string[], query?: Query, maxCount = 10): Observable<ScoredAutocompleteItem<undefined,string>[]> {\n        text = text.trim();\n        if (!this.appService.ccquery || !text) {\n            return of([]);\n        }\n        const sugQuery = suggestQuery || this.appService.suggestQueries[0];\n        const ccquery = this.appService.ccquery.name;\n        return this.suggestQueryWebService.get(sugQuery, text, ccquery, fields).pipe(\n            // If no suggestion is returned, attempt fallback strategies\n            switchMap(suggests => {\n                if(!suggests || suggests.length === 0) {\n                    if (fields) {\n                        // If we are looking for specific fields, use the suggest field web service\n                        return this.getFields(text, fields, query).pipe(map(items => ({items, searchText: text})));\n                    }\n                    else {\n                        // Fall back to a strategy of autocompleting only the last token\n                        const i = text.lastIndexOf(\" \")+1;\n                        if(i > 0) {\n                            const suffix = text.substring(i);\n                            return this.suggestQueryWebService.get(sugQuery, suffix, ccquery).pipe(\n                                tap(items => items?.forEach(s => s.display = s.display)),\n                                map(items => ({items: items || [], searchText: suffix }))\n                            );\n                        }\n                    }\n                }\n                return of({items: suggests || [], searchText: text});\n            }),\n            // Post process suggestions\n            map(({items, searchText}) => items\n                // Deduplicate items\n                .filter((item,i) => items.findIndex(_item => Utils.eqNC(_item.display, item.display)) === i)\n                // Limit the total number of items\n                .slice(0, maxCount)\n                // Add a score and highlight the text with HTML markup\n                .map(item => {\n                    const match = this.findMatch(item.display, searchText, undefined, undefined);\n                    const score = (match?.score || 0) * 0.9; // Reduce the score of suggestions wrt other objects\n                    return {...item, score, displayHtml: match?.displayHtml, data: undefined};\n                })\n            )\n        );\n    }\n\n    getFields(text: string, fields: string | string[], query?: Query): Observable<Suggestion[]> {\n        fields = Utils.asArray(fields).filter(field => {\n            const column = this.appService.getColumn(field);\n            return column && (column.eType === EngineType.csv || AppService.isScalar(column))\n        });\n        if (fields.length > 0) {\n            return this.suggestFieldWebService.get(text, fields, query);\n        }\n        return of([]);\n    }\n\n\n    /**\n     * Search for the input text in a list of objects and return autocomplete items asynchronously\n     * @param query The text to search for\n     * @param data The list of objects\n     * @param primaryText A function that returns the primary text input given the object\n     * @param secondaryText An (optional) function that returns a list of secondary text inputs given the object\n     */\n    public async searchData<T, Tcat extends string>(\n        category: Tcat,\n        query: string,\n        data: T[],\n        primaryText: (obj:T) => string,\n        secondaryText?: (obj:T) => string[],\n        label?: string) : Promise<ScoredAutocompleteItem<T, Tcat>[]> {\n\n        return data\n            .map(obj => this.findMatch(primaryText(obj), query,\n                !!secondaryText ? secondaryText(obj) : [], obj)) // Look for matches in all saved queries\n            .filter((item): item is { display: string; displayHtml: string; score: number; data: T; } => !!item) // Keep only the matches\n            .sort((a,b) => b!.score - a!.score) // Sort by decreasing score\n            .map(item => {\n                item = item!;\n                return {    // Make an autocomplete item\n                    display: item.display,\n                    displayHtml: item.displayHtml,\n                    category,\n                    label: label || category,\n                    data: item.data,\n                    score: item.score\n                };\n            } );\n    }\n\n    /**\n     * Searches for the query string inside a given text. Returns a match object containing:\n     * - a score proportional to the number and quality of matches\n     * - the text formatted as HTML with the query found in the text\n     * @param text The text to search\n     * @param query The string to search for\n     * @param secondaryText Secondary fields to search input, with less importance than the primary field\n     * @param data A data object to be included in the match object (for convenience mostly)\n     */\n    public findMatch<T>(text: string, query: string, secondaryText: string[]|undefined, data: T): {display: string, displayHtml: string, score: number, data:T} | undefined {\n\n        if(!text || !query){\n            return undefined;\n        }\n\n        // pass text and query in lower case and no accent to make search case insensitive\n        let html = text.replace(/<[^>]+>/g,\"\"); // Remove HTML tags to protect against attacks\n        const textLower = Utils.removeAccents(html.toLowerCase());\n        query = Utils.removeAccents(query.toLowerCase());\n        let i = 0;\n        const matches: number[] = [];\n        let score = 0;\n\n        // Compute score of the match\n        i = textLower.indexOf(query);\n        while(i !== -1){    // While there's a match\n            matches.push(i);\n            if(i === 0){    // Start of the text\n                score += 4;\n            }\n            else if(textLower[i-1] === \" \"){ // Start of a word\n                score += 2;\n            }\n            else {\n                score += 1; // Middle of a word\n            }\n            i = textLower.indexOf(query, i+query.length);\n        }\n\n        // Format HTML display\n        for(let j=matches.length-1; j>=0; j--) { // decreasing order so the indices remain valid\n            i = matches[j];\n            html = html.slice(0, i).concat(\"<b>\", html.slice(i, i+query.length), \"</b>\", html.slice(i+query.length));\n        }\n\n        // Secondary text\n        if(secondaryText) {\n            secondaryText\n                .map(t => this.findMatch(t, query, undefined, undefined)) // Search each secondary text for matches\n                .filter(item => !!item) // Keep only the matches\n                .sort((a,b) => b!.score - a!.score) // Sort by decreasing score\n                .forEach(match => {\n                    match = match!;\n                    score += match.score / 2;  // Secondary matches added to the score, but count half\n                    html += \" <small>\" + match.displayHtml + \"</small>\"; // Concatenate secondary match html to the main html\n                });\n        }\n\n        if(score > 0){\n            return {\n                display: text,\n                displayHtml: html,\n                score,\n                data\n            };\n        }\n        return undefined;\n    }\n}\n","import { Observable, Subscription } from \"rxjs\";\n\nimport { Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, inject } from \"@angular/core\";\n\nimport { UIService } from \"@sinequa/components/utils\";\nimport { AppService } from \"@sinequa/core/app-utils\";\nimport { Keys, Utils } from \"@sinequa/core/base\";\n\nimport { SuggestService } from \"./suggest.service\";\n\n/**\n * Minimal interface for autocomplete items (note that the Suggestion\n * objects returned by the Suggestion service implement naturally this\n * interface)\n */\nexport interface AutocompleteItem {\n    display: string;\n    normalized?: string;\n    category: string;\n    label?: string;\n    rank?: number;\n}\n\n/**\n * Interface required to be implemented by the dropdown components\n * binded to this autocomplete directive.\n * The component is responsible for displaying a list of items\n * and signaling back if a component was clicked. The component must\n * also manage navigation through the list (next/previous and selectedValue).\n */\nexport interface AutocompleteComponent {\n\n    /**\n     * Whether there are any item to display\n     */\n    hasItems: boolean;\n\n    /**\n     * Event emitter for clicks on an autocomplete item\n     */\n    clicked: EventEmitter<AutocompleteItem>;\n\n    /**\n     * Returns the currently selected item, if any\n     */\n    selectedValue: AutocompleteItem | undefined;\n\n    /**\n     * Update the data and state of this component\n     * @param active whether the component should be displayed\n     * @param items The list of items to display\n     */\n    update(active: boolean, items?: AutocompleteItem[]): void;\n\n    /**\n     * Select the next item in the list and returns it\n     */\n    selectNext(): AutocompleteItem | undefined;\n\n    /**\n     * Select the previous item in the list and returns it\n     */\n    selectPrevious(): AutocompleteItem | undefined;\n}\n\n/**\n * States in which the autocomplete component can be\n */\nexport enum AutocompleteState {\n    OFF = \"OFF\", // Autocomplete is turned off (via @Input())\n    INIT = \"INIT\", // Input is not focused, dropdown is closed\n    START = \"START\", // Input is focused, no text typed in, dropdown is closed\n    ACTIVE = \"ACTIVE\", // Input is focused, text is typed, suggests are being queried, dropdown is closed\n    OPENED = \"OPENED\", // Input is focused, text is typed, suggests are available, dropdown/autocomplete component is displayed\n    SELECTED = \"SELECTED\" // Input is focused, an input from the dropdown was selected\n}\n\n@Directive({\n    selector: \"[sqAutocomplete]\",\n    standalone: false\n})\nexport class Autocomplete implements OnInit, OnChanges, OnDestroy {\n\n    /** Reference to the AutocompleteComponent that displays the autocomplete items */\n    @Input() dropdown: AutocompleteComponent;\n\n    /** Whether the autocomplete should be active or not */\n    @Input() off: boolean;\n\n    /** Debounce delay between autocomplete queries */\n    @Input() suggestDelay: number = 200;\n\n    /** Name of the Suggest Query to be used */\n    @Input() suggestQuery: string;\n\n    /** Custom placeholder */\n    @Input() placeholder: string = '';\n\n    @HostBinding('attr.placeholder') _placeholder;\n\n    // Event emitters\n\n    @Output() stateChange = new EventEmitter<AutocompleteState>();\n    @Output() submit = new EventEmitter<void>();\n\n    private _state: AutocompleteState = AutocompleteState.INIT;\n\n    // The input HTML element to which this directive is attached\n    protected readonly inputElement: HTMLInputElement;\n\n\n    // Initialization\n    protected readonly elementRef = inject(ElementRef);\n    protected readonly suggestService = inject(SuggestService);\n    protected readonly appService = inject(AppService);\n    protected readonly uiService = inject(UIService);\n\n    constructor(){\n\n        this.inputElement = this.elementRef.nativeElement;\n    }\n\n\n    /**\n     * On initialization, we listen to the autocomplete component for\n     * selection events\n     */\n    ngOnInit(){\n        this._dropdownSubscription = this.dropdown.clicked.subscribe(item => {\n            this.select(item, true);  // An item was selected from the autocomplete => take the value\n        });\n        this._placeholder = this.placeholder;\n        this.inputElement.focus({preventScroll: true});\n        this.start();\n    }\n\n    /**\n     * If the off input changes state, react accordingly\n     * @param changes\n     */\n    ngOnChanges(changes: SimpleChanges){\n        // Turn on the autocomplete\n        if(changes[\"off\"] && !this.off){\n            this.start();\n        }\n    }\n\n\n    protected _dropdownSubscription: Subscription;\n    /**\n     * Unsubscribe when destroying the component\n     */\n    ngOnDestroy(){\n        if(this._dropdownSubscription){\n            this._dropdownSubscription.unsubscribe();\n        }\n    }\n\n\n    // Getters and Setters\n\n    /**\n     * Return the current state of the autocomplete\n     */\n    public getState(): AutocompleteState {\n        return this._state;\n    }\n\n    /**\n     * Set the current state of the autocomplete\n     */\n    protected setState(state: AutocompleteState) {\n        if(this.off){\n            if(this._state !== AutocompleteState.OFF){\n                this._state = AutocompleteState.OFF;\n                this.stateChange.next(this.getState());\n            }\n            // ignore state change if Autocomplete is off\n        }\n        else if(!!state && this._state !== state) {\n            this._state = state;\n            //console.log(\"STATE: \", this._state);\n            this.stateChange.next(this.getState());\n        }\n    }\n\n    /**\n     * Get the current text value of the HTML <input>\n     * to which this directive is attached\n     */\n    protected getInputValue() : string {\n        return this.inputElement.value;\n    }\n\n    /**\n     * Set the current text value of the HTML <input>\n     * to which this directive is attached\n     */\n    protected setInputValue(value: string) {\n        // Using setCaret() allows to properly update the underlying form\n        this.uiService.setCaret(this.inputElement, 0, -1, value); // 0, -1 erases the current value and writes the new one\n    }\n\n    /**\n     * Sets the content of the <input> based on the given\n     * Autocomplete Item (various implementations are possible,\n     * depending on the item content and nature).\n     * This would be the right method to override to implement\n     * fielded search autocomplete.\n     * @returns true if this autocomplete item should be searched\n     */\n    protected setAutocompleteItem(item: AutocompleteItem): boolean {\n        if(item) {\n            this.setInputValue(item.display);\n            return true;\n        }\n        return false;\n    }\n\n\n    // Methods triggering state changes\n\n    /**\n     * INIT state (Input is not focused, dropdown is closed)\n     */\n    protected init(): void {\n        this.setState(AutocompleteState.INIT);\n        this.dropdown.update(false);    // If the dropdown was active\n    }\n\n    /**\n     * START state (Input is focused, no text typed in, dropdown is closed)\n     */\n    protected start(): void {\n        this.setState(AutocompleteState.START);\n        this.dropdown.update(false);    // If the dropdown was active\n    }\n\n    /**\n     * START state and if the <input> has content, immediately switch to ACTIVE\n     */\n    protected startOrActive(): void {\n        if(this.getState()!== AutocompleteState.ACTIVE && this.getState()!== AutocompleteState.OPENED){ // Avoid flickering\n            this.start();\n            if(!!this.getInputValue()){\n                this.active();\n            }\n        }\n    }\n\n    /**\n     * ACTIVE state (Input is focused, text is typed, suggests are being queried, dropdown is closed)\n     */\n    protected active(): void {\n        if(this.getState() === AutocompleteState.START || this.getState() === AutocompleteState.ACTIVE || this.getState() === AutocompleteState.OPENED){\n            this.setState(AutocompleteState.ACTIVE);\n            this.dropdown.update(false);    // If the dropdown was active\n            this.suggest();\n        }\n    }\n\n    /**\n     * Select the given autocomplete suggestion for search\n     * @param submit if, true also trigger a submit\n     * @param item a specific item to submit\n     */\n    protected select(item: AutocompleteItem, submit?: boolean): void {\n        this.setState(AutocompleteState.SELECTED); // Change state BEFORE setting input value, so the event is correctly processed\n        const searchable = this.setAutocompleteItem(item);\n        this.dropdown.update(false);    // Close dropdown\n\n        if(submit && searchable) this.submit.next();\n    }\n\n    /**\n     * Switch to OPENED state (from ACTIVE only)\n     */\n    protected open(): void {\n        if(this.getState() === AutocompleteState.ACTIVE){\n            this.setState(AutocompleteState.OPENED);\n        }\n    }\n\n    /**\n     * Request suggestions from the server, and update the dropdown contents\n     * and autocomplete state asynchronously.\n     * Override this method for a synchronous implementation.\n     */\n    protected suggest() {\n        this.debounceSuggest();\n    }\n\n    /**\n     * Actually makes the API call to the suggestService to retrieve suggestions\n     * and process them.\n     */\n    protected getSuggests() {\n        const value = this.getInputValue();\n        if(value) { // If there is text, make a call to the suggest API\n            this.processSuggests(\n                this.getSuggestsObs(value)\n            );\n        }\n        else {  // If empty input, restart autocomplete\n            this.start();\n        }\n    }\n\n    /**\n     * Returns an observable of Suggestions, given some input text\n     * @param value input text for which to return suggestions\n     */\n    protected getSuggestsObs(value: string, fields?: string[]): Observable<AutocompleteItem[]> {\n        return this.suggestService.get(this.suggestQuery, value, fields);\n    }\n\n    /**\n     * Process suggestions obtained (from whatever mean):\n     * - If data available, filter out fields\n     * - update the dropdown content\n     * - Switch between OPEN and ACTIVE states\n     * - Use changeDetectorRef to update display\n     * @param obs an observable of AutocompleteItem suggestions\n     */\n    protected processSuggests(obs: Observable<AutocompleteItem[]>){\n        obs.subscribe(\n            suggests => {\n                if(this.getState() === AutocompleteState.ACTIVE || this.getState() === AutocompleteState.OPENED){\n                    this.dropdown.update(true, suggests\n                        .filter(item => item.category !== \"$field$\")  // Filter out fields\n                        .map(item => {\n                            if(!item.label){\n                                item.label = this.appService.getLabel(item.category);\n                            }\n                            return item;\n                        }));\n                }\n            },\n            () => {\n                this.dropdown.update(false);\n            },\n            () => {\n                if(this.dropdown.hasItems && this.getState() === AutocompleteState.ACTIVE){\n                    this.open();    // Switch from ACTIVE to OPENED (if not already)\n                }\n                else if(!this.dropdown.hasItems && this.getState() === AutocompleteState.OPENED){   // No data\n                    this.active();  // Switch from OPENED to ACTIVE (if not already)\n                }\n            });\n    }\n\n    /**\n     * Use the suggest service to retrieve suggestions given the input text.\n     * The suggest (autocomplete) query is debounced to avoid flooding the server.\n     */\n    private readonly debounceSuggest: () => void = Utils.debounce(() => {\n        this.getSuggests();\n    }, this.suggestDelay);\n\n\n    /**\n     * Returns the caret position within the input\n     */\n    protected getInputPosition(): number {\n        // Come back before trailing spaces so the preceding value is still seen as the input value\n        const position = this.uiService.getCaret(this.inputElement).start;\n        const length = Utils.len(Utils.trimEnd(this.getInputValue()));\n        return Math.min(position, length);\n    }\n\n    /**\n     * The following are event listeners applied to the <input> host component\n     * onto which this directive is applied.\n     * The events affect the state of the autocomplete, which triggers\n     * various actions (call to suggest API, etc.).\n     */\n\n    /**\n     * Listens to click events on the <input> host\n     */\n    @HostListener(\"click\") click() {\n        // console.log(\"input clicked\");\n        this.startOrActive();\n    }\n\n    /**\n     * Listens to touchstart events (mobile clicks) on the <input> host\n     */\n    @HostListener(\"touchstart\") touchstart() {\n        // console.log(\"input touchstart\");\n        this.startOrActive();\n    }\n\n    /**\n     * Listens to focus events on the <input> host\n     */\n    @HostListener(\"focus\") focus() {\n        // console.log(\"input focus gained\");\n        this.start();\n    }\n\n    /**\n     * Listens to blur events (out of focus) on the <input> host\n     */\n    @HostListener(\"blur\", [\"$event\"]) blur(event: FocusEvent) {\n        //console.log(\"input focus lost\");\n        this.init();\n    }\n\n    /**\n     * Listen to any change in the <input> content and react\n     * according to the current state of the autocomplete\n     * @param event\n     */\n    @HostListener(\"input\", [\"$event\"]) inputChanged(event: Event) {\n        //console.log(\"input value changed\");\n        switch(this.getState()){\n            case AutocompleteState.OPENED:\n                this.suggest(); // Just request more data, but no state change\n                break;\n            case AutocompleteState.START:\n            case AutocompleteState.ACTIVE:\n                this.active(); // get more data, and change state if not already ACTIVE\n                break;\n            case AutocompleteState.SELECTED:\n                this.start(); // The model changed because we selected a value ==> we restart in case the user keeps typing\n                break;\n            case AutocompleteState.INIT:\n                console.error(\"Should not be in INIT state if the form changes\");\n                break;\n        }\n    }\n\n    /**\n     * Listen to user's keyboard actions in the <input>, in order to navigate\n     * and select the autocomplete suggestions.\n     * @param event the keyboard\n     */\n    @HostListener(\"keydown\", [\"$event\"]) keydown(event: KeyboardEvent) {\n        // Navigation in the opened dropdown\n        if (this.getState() === AutocompleteState.OPENED) {\n            switch (event.key) {\n                case Keys.up:\n                    this.dropdown.selectPrevious();\n                    return false; // prevent default\n                case Keys.down:\n                    this.dropdown.selectNext();\n                    return false; // prevent default\n                case Keys.tab:\n                    if(!!this.dropdown.selectedValue){\n                        this.select(this.dropdown.selectedValue);\n                    } else {\n                        this.dropdown.selectNext();\n                    }\n                    return false; // prevent default (change focus)\n                case Keys.esc:\n                    this.start(); // Just restart the autocomplete\n                    //event.stopPropagation(); // needed?\n                    return false; // prevent default\n                case Keys.enter:\n                    if(!!this.dropdown.selectedValue){\n                        this.select(this.dropdown.selectedValue, true);\n                        //event.stopPropagation(); // needed?\n                        return false; // prevent default action (auto submit)\n                    }\n            }\n        }\n\n        // If a search was triggered, restart the autocomplete\n        if(event.key === Keys.enter) {\n            this.submit.next();\n            this.start();\n        }\n        return undefined;\n    }\n}\n","import {NgModule} from \"@angular/core\";\nimport {CommonModule} from \"@angular/common\";\nimport {Autocomplete} from \"../autocomplete.directive\";\nimport {BsAutocompleteList} from \"./autocomplete-list/autocomplete-list\";\nimport {UtilsModule} from '@sinequa/components/utils';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        UtilsModule\n    ],\n    declarations: [\n        BsAutocompleteList, Autocomplete\n    ],\n    exports: [\n        BsAutocompleteList, Autocomplete\n    ]\n})\nexport class BsAutocompleteModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}