{"version":3,"file":"autocomplete.js","sources":["autocomplete.ts"],"sourcesContent":[" /*\r\n  * https://github.com/kraaden/autocomplete\r\n  * Copyright (c) 2016 Denys Krasnoshchok\r\n  * MIT License\r\n  */\r\n\r\nexport const enum EventTrigger {\r\n    Keyboard = 0,\r\n    Focus = 1\r\n}\r\n\r\nexport interface AutocompleteItem {\r\n    label?: string;\r\n    group?: string;\r\n}\r\n\r\nexport interface AutocompleteSettings<T extends AutocompleteItem> {\r\n    input: HTMLInputElement;\r\n    render?: (item: T, currentValue: string) => HTMLDivElement | undefined;\r\n    renderGroup?: (name: string, currentValue: string) => HTMLDivElement | undefined;\r\n    className?: string;\r\n    minLength?: number;\r\n    emptyMsg?: string;\r\n    onSelect: (item: T, input: HTMLInputElement) => void;\r\n    /**\r\n     * Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.\r\n     */\r\n    showOnFocus?: boolean;\r\n    fetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger) => void;\r\n    debounceWaitMs?: number;\r\n    /**\r\n     * Callback for additional autocomplete customization\r\n     * @param {HTMLInputElement} input - input box associated with autocomplete\r\n     * @param {ClientRect | DOMRect} inputRect - size of the input box and its position relative to the viewport\r\n     * @param {HTMLDivElement} container - container with suggestions\r\n     * @param {number} maxHeight - max height that can be used by autocomplete\r\n     */\r\n    customize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n    /**\r\n     * Prevents automatic form submit when ENTER is pressed\r\n     */\r\n    preventSubmit?: boolean;\r\n}\r\n\r\nexport interface AutocompleteResult {\r\n    destroy: () => void;\r\n}\r\n\r\nconst enum Keys {\r\n    Enter = 13,\r\n    Esc = 27,\r\n    Up = 38,\r\n    Down = 40,\r\n    Left = 37,\r\n    Right = 39,\r\n    Shift = 16,\r\n    Ctrl = 17,\r\n    Alt = 18,\r\n    CapsLock = 20,\r\n    WindowsKey = 91,\r\n    Tab = 9\r\n}\r\n\r\nexport default function autocomplete<T extends AutocompleteItem>(settings: AutocompleteSettings<T>): AutocompleteResult {\r\n\r\n    // just an alias to minimize JS file size\r\n    const doc = document;\r\n\r\n    const container: HTMLDivElement = doc.createElement(\"div\");\r\n    const containerStyle = container.style;\r\n    const userAgent = navigator.userAgent;\r\n    const mobileFirefox = userAgent.indexOf(\"Firefox\") !== -1 && userAgent.indexOf(\"Mobile\") !== -1;\r\n    const debounceWaitMs = settings.debounceWaitMs || 0;\r\n    const preventSubmit = settings.preventSubmit || false;\r\n    \r\n    // 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead\r\n    const keyUpEventName = mobileFirefox ? \"input\" : \"keyup\";\r\n    \r\n    let items: T[] = [];\r\n    let inputValue = \"\";\r\n    let minLen = 2;\r\n    const showOnFocus = settings.showOnFocus;\r\n    let selected: T | undefined;\r\n    let keypressCounter = 0;\r\n    let debounceTimer : number | undefined;\r\n\r\n    if (settings.minLength !== undefined) {\r\n        minLen = settings.minLength;\r\n    }\r\n\r\n    if (!settings.input) {\r\n        throw new Error(\"input undefined\");\r\n    }\r\n\r\n    const input: HTMLInputElement = settings.input;\r\n\r\n    container.className = \"autocomplete \" + (settings.className || \"\");\r\n    containerStyle.position = \"fixed\";\r\n\r\n    /**\r\n     * Detach the container from DOM\r\n     */\r\n    function detach(): void {\r\n        const parent = container.parentNode;\r\n        if (parent) {\r\n            parent.removeChild(container);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear debouncing timer if assigned\r\n     */\r\n    function clearDebounceTimer(): void {\r\n        if (debounceTimer) {\r\n            window.clearTimeout(debounceTimer);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Attach the container to DOM\r\n     */\r\n    function attach(): void {\r\n        if (!container.parentNode) {\r\n            doc.body.appendChild(container);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if container for autocomplete is displayed\r\n     */\r\n    function containerDisplayed(): boolean {\r\n        return !!container.parentNode;\r\n    }\r\n\r\n    /**\r\n     * Clear autocomplete state and hide container\r\n     */\r\n    function clear(): void {\r\n        keypressCounter++;\r\n        items = [];\r\n        inputValue = \"\";\r\n        selected = undefined;\r\n        detach();\r\n    }\r\n\r\n    /**\r\n     * Update autocomplete position\r\n     */\r\n    function updatePosition(): void {\r\n        if (!containerDisplayed()) {\r\n            return;\r\n        }\r\n\r\n        containerStyle.height = \"auto\";\r\n        containerStyle.width = input.offsetWidth + \"px\";\r\n\r\n        const inputRect = input.getBoundingClientRect();\r\n        const top = inputRect.top + input.offsetHeight;\r\n        let maxHeight = window.innerHeight - top;\r\n\r\n        if (maxHeight < 0) {\r\n            maxHeight = 0;\r\n        }\r\n\r\n        containerStyle.top = top + \"px\";\r\n        containerStyle.bottom = \"\";\r\n        containerStyle.left = inputRect.left + \"px\";\r\n        containerStyle.maxHeight = maxHeight + \"px\";\r\n\r\n        if (settings.customize) {\r\n            settings.customize(input, inputRect, container, maxHeight);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Redraw the autocomplete div element with suggestions\r\n     */\r\n    function update(): void {\r\n        \r\n        // delete all children from autocomplete DOM container\r\n        while (container.firstChild) {\r\n            container.removeChild(container.firstChild);\r\n        }\r\n\r\n        // function for rendering autocomplete suggestions\r\n        let render = function(item: T, currentValue: string): HTMLDivElement | undefined {\r\n            const itemElement = doc.createElement(\"div\");\r\n            itemElement.textContent = item.label || \"\";\r\n            return itemElement;\r\n        };\r\n        if (settings.render) {\r\n            render = settings.render;\r\n        }\r\n\r\n        // function to render autocomplete groups\r\n        let renderGroup = function(groupName: string, currentValue: string): HTMLDivElement | undefined {\r\n            const groupDiv = doc.createElement(\"div\");\r\n            groupDiv.textContent = groupName;\r\n            return groupDiv;\r\n        };\r\n        if (settings.renderGroup) {\r\n            renderGroup = settings.renderGroup;\r\n        }\r\n\r\n        const fragment = doc.createDocumentFragment();\r\n        let prevGroup = \"#9?$\";\r\n\r\n        items.forEach(function(item: T): void {\r\n            if (item.group && item.group !== prevGroup) {\r\n                prevGroup = item.group;\r\n                const groupDiv = renderGroup(item.group, inputValue);\r\n                if (groupDiv) {\r\n                    groupDiv.className += \" group\";\r\n                    fragment.appendChild(groupDiv);\r\n                }\r\n            }\r\n            const div = render(item, inputValue);\r\n            if (div) {\r\n                div.addEventListener(\"click\", function(ev: MouseEvent): void {\r\n                    settings.onSelect(item, input);\r\n                    clear();\r\n                    ev.preventDefault();\r\n                    ev.stopPropagation();\r\n                });\r\n                if (item === selected) {\r\n                    div.className += \" selected\";\r\n                }\r\n                fragment.appendChild(div);\r\n            }\r\n        });\r\n        container.appendChild(fragment);\r\n        if (items.length < 1) {\r\n            if (settings.emptyMsg) {\r\n                const empty = doc.createElement(\"div\");\r\n                empty.className = \"empty\";\r\n                empty.textContent = settings.emptyMsg;\r\n                container.appendChild(empty);\r\n            } else {\r\n                clear();\r\n                return;\r\n            }\r\n        }\r\n\r\n        attach();\r\n        updatePosition();\r\n\r\n        updateScroll();\r\n    }\r\n\r\n    function updateIfDisplayed(): void {\r\n        if (containerDisplayed()) {\r\n            update();\r\n        }\r\n    }\r\n\r\n    function resizeEventHandler(): void {\r\n        updateIfDisplayed();\r\n    }\r\n\r\n    function scrollEventHandler(e: Event): void {\r\n        if (e.target !== container) {\r\n            updateIfDisplayed();\r\n        } else {\r\n            e.preventDefault();\r\n        }\r\n    }\r\n\r\n    function keyupEventHandler(ev: KeyboardEvent): void {\r\n        const keyCode = ev.which || ev.keyCode || 0;\r\n\r\n        const ignore = [Keys.Up, Keys.Enter, Keys.Esc, Keys.Right, Keys.Left, Keys.Shift, Keys.Ctrl, Keys.Alt, Keys.CapsLock, Keys.WindowsKey, Keys.Tab];\r\n        for (const key of ignore) {\r\n            if (keyCode === key) {\r\n                return;\r\n            }\r\n        }\r\n\r\n        // the down key is used to open autocomplete\r\n        if (keyCode === Keys.Down && containerDisplayed()) {\r\n            return;\r\n        }\r\n\r\n        startFetch(EventTrigger.Keyboard);\r\n    }\r\n\r\n    /**\r\n     * Automatically move scroll bar if selected item is not visible\r\n     */\r\n    function updateScroll(): void {\r\n        const elements = container.getElementsByClassName(\"selected\");\r\n        if (elements.length > 0) {\r\n            let element = elements[0] as HTMLDivElement;\r\n            \r\n            // make group visible\r\n            const previous = element.previousElementSibling as HTMLDivElement;\r\n            if (previous && previous.className.indexOf(\"group\") !== -1 && !previous.previousElementSibling) {\r\n                element = previous;\r\n            }\r\n\r\n            if (element.offsetTop < container.scrollTop) {\r\n                container.scrollTop = element.offsetTop;\r\n            } else {\r\n                const selectBottom = element.offsetTop + element.offsetHeight;\r\n                const containerBottom = container.scrollTop + container.offsetHeight;\r\n                if (selectBottom > containerBottom) {\r\n                    container.scrollTop += selectBottom - containerBottom;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Select the previous item in suggestions\r\n     */\r\n    function selectPrev(): void {\r\n        if (items.length < 1) {\r\n            selected = undefined;\r\n        } else {\r\n            if (selected === items[0]) {\r\n                selected = items[items.length - 1];\r\n            } else {\r\n                for (let i = items.length - 1; i > 0; i--) {\r\n                    if (selected === items[i] || i === 1) {\r\n                        selected = items[i - 1];\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Select the next item in suggestions\r\n     */\r\n    function selectNext(): void {\r\n        if (items.length < 1) {\r\n            selected = undefined;\r\n        }\r\n        if (!selected || selected === items[items.length - 1]) {\r\n            selected = items[0];\r\n            return;\r\n        }\r\n        for (let i = 0; i < (items.length - 1); i++) {\r\n            if (selected === items[i]) {\r\n                selected = items[i + 1];\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    function keydownEventHandler(ev: KeyboardEvent): void {\r\n        const keyCode = ev.which || ev.keyCode || 0;\r\n\r\n        if (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\r\n            const containerIsDisplayed = containerDisplayed();\r\n\r\n            if (keyCode === Keys.Esc) {\r\n                clear();\r\n            } else {\r\n                if (!containerDisplayed || items.length < 1) {\r\n                    return;\r\n                }\r\n                keyCode === Keys.Up\r\n                    ? selectPrev()\r\n                    : selectNext();\r\n                update();\r\n            }\r\n\r\n            ev.preventDefault();\r\n            if (containerIsDisplayed) {\r\n                ev.stopPropagation();\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        if (keyCode === Keys.Enter) {\r\n            if (selected) {\r\n                settings.onSelect(selected, input);\r\n                clear();\r\n            }\r\n    \r\n            if (preventSubmit) {\r\n                ev.preventDefault();\r\n            }\r\n        }\r\n    }\r\n\r\n    function focusEventHandler(): void {\r\n        if (showOnFocus) {\r\n            startFetch(EventTrigger.Focus);\r\n        }\r\n    }\r\n\r\n    function startFetch(trigger: EventTrigger) {\r\n        // if multiple keys were pressed, before we get update from server,\r\n        // this may cause redrawing our autocomplete multiple times after the last key press.\r\n        // to avoid this, the number of times keyboard was pressed will be\r\n        // saved and checked before redraw our autocomplete box.\r\n        const savedKeypressCounter = ++keypressCounter;\r\n\r\n        const val = input.value;\r\n        if (val.length >= minLen || trigger === EventTrigger.Focus) {\r\n            clearDebounceTimer();\r\n            debounceTimer = window.setTimeout(function(): void {\r\n                settings.fetch(val, function(elements: T[] | false): void {\r\n                    if (keypressCounter === savedKeypressCounter && elements) {\r\n                        items = elements;\r\n                        inputValue = val;\r\n                        selected = items.length > 0 ? items[0] : undefined;\r\n                        update();\r\n                    }\r\n                }, EventTrigger.Keyboard);\r\n            }, trigger === EventTrigger.Keyboard ? debounceWaitMs : 0);\r\n        } else {\r\n            clear();\r\n        }\r\n    }\r\n\r\n    function blurEventHandler(): void {\r\n        // we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\r\n        setTimeout(() => {\r\n            if (doc.activeElement !== input) {\r\n                clear();\r\n            }\r\n        }, 200);\r\n    }\r\n\r\n    /**\r\n     * Fixes #26: on long clicks focus will be lost and onSelect method will not be called\r\n     */\r\n    container.addEventListener(\"mousedown\", function(evt: Event) {\r\n        evt.stopPropagation();\r\n        evt.preventDefault();\r\n    });\r\n\r\n    /**\r\n     * This function will remove DOM elements and clear event handlers\r\n     */\r\n    function destroy(): void {\r\n        input.removeEventListener(\"focus\", focusEventHandler);\r\n        input.removeEventListener(\"keydown\", keydownEventHandler);\r\n        input.removeEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n        input.removeEventListener(\"blur\", blurEventHandler);\r\n        window.removeEventListener(\"resize\", resizeEventHandler);\r\n        doc.removeEventListener(\"scroll\", scrollEventHandler, true);\r\n        clearDebounceTimer();\r\n        clear();\r\n\r\n        // prevent the update call if there are pending AJAX requests\r\n        keypressCounter++;\r\n    }\r\n\r\n    // setup event handlers\r\n    input.addEventListener(\"keydown\", keydownEventHandler);\r\n    input.addEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n    input.addEventListener(\"blur\", blurEventHandler);\r\n    input.addEventListener(\"focus\", focusEventHandler);\r\n    window.addEventListener(\"resize\", resizeEventHandler);\r\n    doc.addEventListener(\"scroll\", scrollEventHandler, true);\r\n\r\n    return {\r\n        destroy\r\n    };\r\n}\r\n"],"names":[],"mappings":"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"}