{"version":3,"sources":["dbs.auto.ts"],"names":["DBS","AutoComplete","autoItems","AutoCompleteWidget","options","_this","this","ajax","timeout","postUrl","inputContainer","document","getElementById","inputContainerId","inputElement","inputElementId","errorElement","errorElementId","submitElement","submitElementId","addEventListener","ev","initiateSearch","prototype","clearTimeout","readyState","XMLHttpRequest","DONE","abort","setInterval","sendSearch","target","ctrl","inputCtrl","value","length","oldItems","getElementsByTagName","i","remove","completeSearch","open","setRequestHeader","send","encodeURIComponent","status","items","JSON","parse","responseText","classList","autoList","createElement","listItem","innerText","click","selectSearch","appendChild","add","item","SetupAutoComplete","push"],"mappings":"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","file":"dbs.auto.js","sourcesContent":["module DBS.AutoComplete\r\n{\r\n export interface IAutoCompleteOptions\r\n {\r\n postUrl: string;\r\n inputContainerId: string;\r\n inputElementId: string;\r\n errorElementId: string;\r\n submitElementId: string;\r\n }\r\n\r\n let autoItems: AutoCompleteWidget[] = [];\r\n const rateLimitDelay = 100;\r\n\r\n class AutoCompleteWidget\r\n {\r\n private readonly inputContainer: HTMLDivElement;\r\n private readonly inputElement: HTMLInputElement;\r\n private readonly errorElement: HTMLParagraphElement;\r\n private readonly submitElement: HTMLButtonElement;\r\n private readonly postUrl: string;\r\n\r\n private ajax: XMLHttpRequest | null = null;\r\n private timeout: number | null = null;\r\n\r\n private initiateSearch(ev: Event)\r\n {\r\n if (this.timeout != null)\r\n {\r\n clearTimeout(this.timeout);\r\n }\r\n\r\n if (this.ajax != null && this.ajax.readyState !== XMLHttpRequest.DONE)\r\n {\r\n this.ajax.abort();\r\n }\r\n\r\n this.timeout = setInterval(() => this.sendSearch(ev.target), rateLimitDelay);\r\n }\r\n\r\n private sendSearch(ctrl: EventTarget | null)\r\n {\r\n if (this.timeout != null)\r\n {\r\n clearTimeout(this.timeout);\r\n }\r\n\r\n if (ctrl == null)\r\n {\r\n return;\r\n }\r\n\r\n const inputCtrl = ctrl as HTMLInputElement;\r\n\r\n if (inputCtrl.value.length < 3)\r\n {\r\n const oldItems = this.inputContainer.getElementsByTagName(\"ul\");\r\n\r\n for (let i = 0; i < oldItems.length; i++)\r\n {\r\n oldItems[i].remove();\r\n }\r\n return;\r\n }\r\n\r\n this.ajax = new XMLHttpRequest();\r\n this.ajax.addEventListener(\"readystatechange\", () => this.completeSearch());\r\n this.ajax.open(\"POST\", this.postUrl, true);\r\n this.ajax.setRequestHeader(\"accept\", \"application/json\");\r\n this.ajax.setRequestHeader(\"content-type\", \"application/x-www-form-urlencoded; charset=UTF-8\");\r\n this.ajax.send(`=${encodeURIComponent(inputCtrl.value)}`);\r\n }\r\n\r\n private completeSearch()\r\n {\r\n if (this.ajax == null)\r\n {\r\n return;\r\n }\r\n\r\n if (this.ajax.readyState !== XMLHttpRequest.DONE || this.ajax.status !== 200)\r\n {\r\n return;\r\n }\r\n\r\n const items = JSON.parse(this.ajax.responseText) as string[];\r\n\r\n const oldItems = this.inputContainer.getElementsByTagName(\"ul\");\r\n for (let i = 0; i < oldItems.length; i++)\r\n {\r\n oldItems[i].remove();\r\n }\r\n\r\n if (items.length === 0)\r\n {\r\n this.errorElement.classList.add(\"show\");\r\n return;\r\n }\r\n\r\n this.errorElement.classList.remove(\"show\");\r\n const autoList = document.createElement(\"ul\") as HTMLUListElement;\r\n\r\n for (let i = 0; i < items.length; i++)\r\n {\r\n const listItem = document.createElement(\"li\") as HTMLLIElement;\r\n listItem.innerText = items[i];\r\n listItem.addEventListener(\"click\", (click) => this.selectSearch(click));\r\n autoList.appendChild(listItem);\r\n }\r\n\r\n this.inputContainer.appendChild(autoList);\r\n }\r\n\r\n private selectSearch(ev: Event)\r\n {\r\n const item = ev.target as HTMLLIElement;\r\n\r\n this.inputElement.value = item.innerText;\r\n\r\n const oldItems = this.inputContainer.getElementsByTagName(\"ul\");\r\n for (let i = 0; i < oldItems.length; i++)\r\n {\r\n oldItems[i].remove();\r\n }\r\n\r\n this.submitElement.click();\r\n }\r\n\r\n constructor(options: IAutoCompleteOptions)\r\n {\r\n this.postUrl = options.postUrl;\r\n this.inputContainer = document.getElementById(options.inputContainerId) as HTMLDivElement;\r\n this.inputElement = document.getElementById(options.inputElementId) as HTMLInputElement;\r\n this.errorElement = document.getElementById(options.errorElementId) as HTMLParagraphElement;\r\n this.submitElement = document.getElementById(options.submitElementId) as HTMLButtonElement;\r\n\r\n this.inputElement.addEventListener(\"input\", (ev) => this.initiateSearch(ev));\r\n }\r\n }\r\n\r\n export function SetupAutoComplete(options: IAutoCompleteOptions)\r\n {\r\n const item = new AutoCompleteWidget(options);\r\n autoItems.push(item);\r\n }\r\n}"]}