{"version":3,"file":"autocomplete.js","sources":["autocomplete.ts"],"sourcesContent":["/*\n * https://github.com/kraaden/autocomplete\n * Copyright (c) 2016 Denys Krasnoshchok\n * MIT License\n */\n\nexport const enum EventTrigger {\n Keyboard = 0,\n Focus = 1\n}\n\nexport interface AutocompleteItem {\n label?: string;\n group?: string;\n}\n\nexport interface AutocompleteSettings {\n /**\n * Autocomplete will be attached to this element.\n */\n input: HTMLInputElement | HTMLTextAreaElement;\n\n /**\n * Provide your own container for the widget.\n * If not specified, a new DIV element will be created.\n */\n container?: HTMLDivElement;\n\n /**\n * This method allows you to override the default rendering function for items.\n * It must return a DIV element or undefined to skip rendering.\n */\n render?: (item: T, currentValue: string, index: number) => HTMLDivElement | undefined;\n\n /**\n * This method allows you to override the default rendering function for item groups.\n * It must return a DIV element or undefined to skip rendering.\n */\n renderGroup?: (name: string, currentValue: string) => HTMLDivElement | undefined;\n\n /**\n * If specified, the autocomplete DOM element will have this class assigned to it.\n */\n className?: string;\n\n /**\n * Specify the minimum text length required to show autocomplete.\n */\n minLength?: number;\n\n /**\n * The message that will be showed when there are no suggestions that match the entered value.\n */\n emptyMsg?: string;\n\n /**\n * This method will be called when user choose an item in autocomplete. The selected item will be passed as the first parameter.\n */\n onSelect: (item: T, input: HTMLInputElement | HTMLTextAreaElement) => void;\n\n /**\n * Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.\n */\n showOnFocus?: boolean;\n\n /**\n * This method will be called to prepare suggestions and then pass them to autocomplete.\n * @param {string} text - text in the input field\n * @param {(items: T[] | false) => void} update - a callback function that must be called after suggestions are prepared\n * @param {EventTrigger} trigger - type of the event that triggered the fetch\n * @param {number} cursorPos - position of the cursor in the input field\n */\n fetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger, cursorPos: number) => void;\n\n /**\n * Enforces that the fetch function will only be called once within the specified time frame (in milliseconds) and\n * delays execution. This prevents flooding your server with AJAX requests.\n */\n debounceWaitMs?: number;\n\n /**\n * Callback for additional autocomplete customization\n * @param {HTMLInputElement | HTMLTextAreaElement} input - input box associated with autocomplete\n * @param {ClientRect | DOMRect} inputRect - size of the input box and its position relative to the viewport\n * @param {HTMLDivElement} container - container with suggestions\n * @param {number} maxHeight - max height that can be used by autocomplete\n */\n customize?: (input: HTMLInputElement | HTMLTextAreaElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\n\n /**\n * Prevents automatic form submit when ENTER is pressed\n */\n preventSubmit?: boolean;\n\n /**\n * Prevents the first item in the list from being selected automatically. This option allows you\n * to submit a custom text by pressing ENTER even when autocomplete is displayed.\n */\n disableAutoSelect?: boolean;\n\n /**\n * Keys that will be ignored and not trigger the fetch callback.\n */\n keysToIgnore?: Keys[];\n}\n\nexport interface AutocompleteResult {\n destroy: () => void;\n}\n\nexport const enum Keys {\n Enter = 13,\n Esc = 27,\n Up = 38,\n Down = 40,\n Left = 37,\n Right = 39,\n Shift = 16,\n Ctrl = 17,\n Alt = 18,\n CapsLock = 20,\n WindowsKey = 91,\n Tab = 9,\n F1 = 112,\n F12 = 123\n}\n\nexport default function autocomplete(settings: AutocompleteSettings): AutocompleteResult {\n\n // just an alias to minimize JS file size\n const doc = document;\n\n const container: HTMLDivElement = settings.container || doc.createElement(\"div\");\n container.id = container.id || \"autocomplete-\" + uid();\n const containerStyle = container.style;\n const userAgent = navigator.userAgent;\n const mobileFirefox = ~userAgent.indexOf(\"Firefox\") && ~userAgent.indexOf(\"Mobile\");\n const debounceWaitMs = settings.debounceWaitMs || 0;\n const preventSubmit = settings.preventSubmit || false;\n const disableAutoSelect = settings.disableAutoSelect || false;\n\n // 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead\n const keyUpEventName = mobileFirefox ? \"input\" : \"keyup\";\n\n let items: T[] = [];\n let inputValue = \"\";\n let minLen = 2;\n const showOnFocus = settings.showOnFocus;\n let selected: T | undefined;\n let keypressCounter = 0;\n let debounceTimer: number | undefined;\n\n if (settings.minLength !== undefined) {\n minLen = settings.minLength;\n }\n\n if (!settings.input) {\n throw new Error(\"input undefined\");\n }\n\n const input: HTMLInputElement | HTMLTextAreaElement = settings.input;\n\n container.className = \"autocomplete \" + (settings.className || \"\");\n container.setAttribute(\"role\", \"listbox\");\n\n input.setAttribute(\"role\", \"combobox\");\n input.setAttribute(\"aria-expanded\", \"false\");\n input.setAttribute(\"aria-autocomplete\", \"list\");\n input.setAttribute(\"aria-controls\", container.id);\n input.setAttribute(\"aria-owns\", container.id);\n input.setAttribute(\"aria-activedescendant\", \"\");\n input.setAttribute(\"aria-haspopup\", \"listbox\");\n\n // IOS implementation for fixed positioning has many bugs, so we will use absolute positioning\n containerStyle.position = \"absolute\";\n\n /**\n * Generate a unique ID\n */\n function uid(): string {\n return Date.now().toString(36) + Math.random().toString(36).substring(2);\n }\n\n /**\n * Detach the container from DOM\n */\n function detach(): void {\n const parent = container.parentNode;\n if (parent) {\n parent.removeChild(container);\n }\n }\n\n /**\n * Clear debouncing timer if assigned\n */\n function clearDebounceTimer(): void {\n if (debounceTimer) {\n window.clearTimeout(debounceTimer);\n }\n }\n\n /**\n * Attach the container to DOM\n */\n function attach(): void {\n if (!container.parentNode) {\n doc.body.appendChild(container);\n }\n }\n\n /**\n * Check if container for autocomplete is displayed\n */\n function containerDisplayed(): boolean {\n return !!container.parentNode;\n }\n\n /**\n * Clear autocomplete state and hide container\n */\n function clear(): void {\n // prevent the update call if there are pending AJAX requests\n keypressCounter++;\n\n items = [];\n inputValue = \"\";\n selected = undefined;\n input.setAttribute(\"aria-activedescendant\", \"\");\n input.setAttribute(\"aria-expanded\", \"false\");\n detach();\n }\n\n /**\n * Update autocomplete position\n */\n function updatePosition(): void {\n if (!containerDisplayed()) {\n return;\n }\n\n input.setAttribute(\"aria-expanded\", \"true\");\n\n containerStyle.height = \"auto\";\n containerStyle.width = input.offsetWidth + \"px\";\n\n let maxHeight = 0;\n let inputRect: ClientRect | DOMRect | undefined;\n\n function calc() {\n const docEl = doc.documentElement as HTMLElement;\n const clientTop = docEl.clientTop || doc.body.clientTop || 0;\n const clientLeft = docEl.clientLeft || doc.body.clientLeft || 0;\n const scrollTop = window.pageYOffset || docEl.scrollTop;\n const scrollLeft = window.pageXOffset || docEl.scrollLeft;\n\n inputRect = input.getBoundingClientRect();\n\n const top = inputRect.top + input.offsetHeight + scrollTop - clientTop;\n const left = inputRect.left + scrollLeft - clientLeft;\n\n containerStyle.top = top + \"px\";\n containerStyle.left = left + \"px\";\n\n maxHeight = window.innerHeight - (inputRect.top + input.offsetHeight);\n\n if (maxHeight < 0) {\n maxHeight = 0;\n }\n\n containerStyle.top = top + \"px\";\n containerStyle.bottom = \"\";\n containerStyle.left = left + \"px\";\n containerStyle.maxHeight = maxHeight + \"px\";\n }\n\n // the calc method must be called twice, otherwise the calculation may be wrong on resize event (chrome browser)\n calc();\n calc();\n\n if (settings.customize && inputRect) {\n settings.customize(input, inputRect, container, maxHeight);\n }\n }\n\n /**\n * Redraw the autocomplete div element with suggestions\n */\n function update(): void {\n\n // delete all children from autocomplete DOM container\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n\n input.setAttribute(\"aria-activedescendant\", \"\");\n\n // function for rendering autocomplete suggestions\n let render = function (item: T, _: string, __: number): HTMLDivElement | undefined {\n const itemElement = doc.createElement(\"div\");\n itemElement.textContent = item.label || \"\";\n return itemElement;\n };\n if (settings.render) {\n render = settings.render;\n }\n\n // function to render autocomplete groups\n let renderGroup = function (groupName: string, _: string): HTMLDivElement | undefined {\n const groupDiv = doc.createElement(\"div\");\n groupDiv.textContent = groupName;\n return groupDiv;\n };\n if (settings.renderGroup) {\n renderGroup = settings.renderGroup;\n }\n\n const fragment = doc.createDocumentFragment();\n let prevGroup = \"#9?$\";\n\n items.forEach(function (item: T, index: number): void {\n if (item.group && item.group !== prevGroup) {\n prevGroup = item.group;\n const groupDiv = renderGroup(item.group, inputValue);\n if (groupDiv) {\n groupDiv.className += \" group\";\n fragment.appendChild(groupDiv);\n }\n }\n const div = render(item, inputValue, index);\n if (div) {\n div.id = `${container.id}_${index}`;\n div.setAttribute(\"role\", \"option\");\n div.addEventListener(\"click\", function (ev: MouseEvent): void {\n settings.onSelect(item, input);\n clear();\n ev.preventDefault();\n ev.stopPropagation();\n });\n if (item === selected) {\n div.className += \" selected\";\n div.setAttribute(\"aria-selected\", \"true\");\n input.setAttribute(\"aria-activedescendant\", div.id);\n }\n fragment.appendChild(div);\n }\n });\n container.appendChild(fragment);\n if (items.length < 1) {\n if (settings.emptyMsg) {\n const empty = doc.createElement(\"div\");\n empty.id = `${container.id}_${uid()}`;\n empty.className = \"empty\";\n empty.textContent = settings.emptyMsg;\n container.appendChild(empty);\n input.setAttribute(\"aria-activedescendant\", empty.id);\n } else {\n clear();\n return;\n }\n }\n\n attach();\n updatePosition();\n\n updateScroll();\n }\n\n function updateIfDisplayed(): void {\n if (containerDisplayed()) {\n update();\n }\n }\n\n function resizeEventHandler(): void {\n updateIfDisplayed();\n }\n\n function scrollEventHandler(e: Event): void {\n if (e.target !== container) {\n updateIfDisplayed();\n } else {\n e.preventDefault();\n }\n }\n\n function keyupEventHandler(ev: KeyboardEvent): void {\n const keyCode = ev.which || ev.keyCode || 0;\n\n const ignore = settings.keysToIgnore || [Keys.Up, Keys.Enter, Keys.Esc, Keys.Right, Keys.Left, Keys.Shift, Keys.Ctrl, Keys.Alt, Keys.CapsLock, Keys.WindowsKey, Keys.Tab];\n for (const key of ignore) {\n if (keyCode === key) {\n return;\n }\n }\n\n if (keyCode >= Keys.F1 && keyCode <= Keys.F12 && !settings.keysToIgnore) {\n return;\n }\n\n // the down key is used to open autocomplete\n if (keyCode === Keys.Down && containerDisplayed()) {\n return;\n }\n\n startFetch(EventTrigger.Keyboard);\n }\n\n /**\n * Automatically move scroll bar if selected item is not visible\n */\n function updateScroll(): void {\n const elements = container.getElementsByClassName(\"selected\");\n if (elements.length > 0) {\n let element = elements[0] as HTMLDivElement;\n\n // make group visible\n const previous = element.previousElementSibling as HTMLDivElement;\n if (previous && previous.className.indexOf(\"group\") !== -1 && !previous.previousElementSibling) {\n element = previous;\n }\n\n if (element.offsetTop < container.scrollTop) {\n container.scrollTop = element.offsetTop;\n } else {\n const selectBottom = element.offsetTop + element.offsetHeight;\n const containerBottom = container.scrollTop + container.offsetHeight;\n if (selectBottom > containerBottom) {\n container.scrollTop += selectBottom - containerBottom;\n }\n }\n }\n }\n\n /**\n * Select the previous item in suggestions\n */\n function selectPrev(): void {\n if (items.length < 1) {\n selected = undefined;\n } else {\n if (selected === items[0]) {\n selected = items[items.length - 1];\n } else {\n for (let i = items.length - 1; i > 0; i--) {\n if (selected === items[i] || i === 1) {\n selected = items[i - 1];\n break;\n }\n }\n }\n }\n }\n\n /**\n * Select the next item in suggestions\n */\n function selectNext(): void {\n if (items.length < 1) {\n selected = undefined;\n }\n if (!selected || selected === items[items.length - 1]) {\n selected = items[0];\n return;\n }\n for (let i = 0; i < (items.length - 1); i++) {\n if (selected === items[i]) {\n selected = items[i + 1];\n break;\n }\n }\n }\n\n function keydownEventHandler(ev: KeyboardEvent): void {\n const keyCode = ev.which || ev.keyCode || 0;\n\n if (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\n const containerIsDisplayed = containerDisplayed();\n\n if (keyCode === Keys.Esc) {\n clear();\n } else {\n if (!containerIsDisplayed || items.length < 1) {\n return;\n }\n keyCode === Keys.Up\n ? selectPrev()\n : selectNext();\n update();\n }\n\n ev.preventDefault();\n if (containerIsDisplayed) {\n ev.stopPropagation();\n }\n\n return;\n }\n\n if (keyCode === Keys.Enter) {\n if (selected) {\n settings.onSelect(selected, input);\n clear();\n }\n\n if (preventSubmit) {\n ev.preventDefault();\n }\n }\n }\n\n function focusEventHandler(): void {\n if (showOnFocus) {\n startFetch(EventTrigger.Focus);\n }\n }\n\n function startFetch(trigger: EventTrigger) {\n // If multiple keys were pressed, before we get an update from server,\n // this may cause redrawing autocomplete multiple times after the last key was pressed.\n // To avoid this, the number of times keyboard was pressed will be saved and checked before redraw.\n const savedKeypressCounter = ++keypressCounter;\n\n const inputText = input.value;\n const cursorPos = input.selectionStart || 0;\n\n if (inputText.length >= minLen || trigger === EventTrigger.Focus) {\n clearDebounceTimer();\n debounceTimer = window.setTimeout(function (): void {\n settings.fetch(inputText, function (elements: T[] | false): void {\n if (keypressCounter === savedKeypressCounter && elements) {\n items = elements;\n inputValue = inputText;\n selected = (items.length < 1 || disableAutoSelect) ? undefined : items[0];\n update();\n }\n }, trigger, cursorPos);\n }, trigger === EventTrigger.Keyboard ? debounceWaitMs : 0);\n } else {\n clear();\n }\n }\n\n function blurEventHandler(): void {\n // we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\n setTimeout(() => {\n if (doc.activeElement !== input) {\n clear();\n }\n }, 200);\n }\n\n /**\n * Fixes #26: on long clicks focus will be lost and onSelect method will not be called\n */\n container.addEventListener(\"mousedown\", function (evt: Event) {\n evt.stopPropagation();\n evt.preventDefault();\n });\n\n /**\n * Fixes #30: autocomplete closes when scrollbar is clicked in IE\n * See: https://stackoverflow.com/a/9210267/13172349\n */\n container.addEventListener(\"focus\", () => input.focus());\n\n /**\n * This function will remove DOM elements and clear event handlers\n */\n function destroy(): void {\n input.removeEventListener(\"focus\", focusEventHandler);\n input.removeEventListener(\"keydown\", keydownEventHandler as EventListenerOrEventListenerObject);\n input.removeEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\n input.removeEventListener(\"blur\", blurEventHandler);\n window.removeEventListener(\"resize\", resizeEventHandler);\n doc.removeEventListener(\"scroll\", scrollEventHandler, true);\n input.removeAttribute(\"role\");\n input.removeAttribute(\"aria-expanded\");\n input.removeAttribute(\"aria-autocomplete\");\n input.removeAttribute(\"aria-controls\");\n input.removeAttribute(\"aria-activedescendant\");\n input.removeAttribute(\"aria-owns\");\n input.removeAttribute(\"aria-haspopup\");\n clearDebounceTimer();\n clear();\n }\n\n // setup event handlers\n input.addEventListener(\"keydown\", keydownEventHandler as EventListenerOrEventListenerObject);\n input.addEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\n input.addEventListener(\"blur\", blurEventHandler);\n input.addEventListener(\"focus\", focusEventHandler);\n window.addEventListener(\"resize\", resizeEventHandler);\n doc.addEventListener(\"scroll\", scrollEventHandler, true);\n\n return {\n destroy\n };\n}\n"],"names":[],"mappings":"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"}