summaryrefslogtreecommitdiff
path: root/searx/static/themes/simple/js/autocomplete.min.js.map
blob: 0e11a5c6af73f89dc437a144245769056a44e624 (plain)
1
{"version":3,"file":"autocomplete.min.js","names":["res: Response","timeoutId: number","autocomplete: HTMLElement | null","autocompleteList: HTMLUListElement | null"],"sources":["../../../../../client/simple/src/js/main/autocomplete.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { assertElement, http, listen, settings } from \"../core/toolkit.ts\";\n\nconst fetchResults = async (qInput: HTMLInputElement, query: string): Promise<void> => {\n  try {\n    let res: Response;\n\n    if (settings.method === \"GET\") {\n      res = await http(\"GET\", `./autocompleter?q=${query}`);\n    } else {\n      res = await http(\"POST\", \"./autocompleter\", { body: new URLSearchParams({ q: query }) });\n    }\n\n    const results = await res.json();\n\n    const autocomplete = document.querySelector<HTMLElement>(\".autocomplete\");\n    assertElement(autocomplete);\n\n    const autocompleteList = document.querySelector<HTMLUListElement>(\".autocomplete ul\");\n    assertElement(autocompleteList);\n\n    autocomplete.classList.add(\"open\");\n    autocompleteList.replaceChildren();\n\n    // show an error message that no result was found\n    if (results?.[1]?.length === 0) {\n      const noItemFoundMessage = Object.assign(document.createElement(\"li\"), {\n        className: \"no-item-found\",\n        textContent: settings.translations?.no_item_found ?? \"No results found\"\n      });\n      autocompleteList.append(noItemFoundMessage);\n      return;\n    }\n\n    const fragment = new DocumentFragment();\n\n    for (const result of results[1]) {\n      const li = Object.assign(document.createElement(\"li\"), { textContent: result });\n\n      listen(\"mousedown\", li, () => {\n        qInput.value = result;\n\n        const form = document.querySelector<HTMLFormElement>(\"#search\");\n        form?.submit();\n\n        autocomplete.classList.remove(\"open\");\n      });\n\n      fragment.append(li);\n    }\n\n    autocompleteList.append(fragment);\n  } catch (error) {\n    console.error(\"Error fetching autocomplete results:\", error);\n  }\n};\n\nconst qInput = document.getElementById(\"q\") as HTMLInputElement | null;\nassertElement(qInput);\n\nlet timeoutId: number;\n\nlisten(\"input\", qInput, () => {\n  clearTimeout(timeoutId);\n\n  const query = qInput.value;\n  const minLength = settings.autocomplete_min ?? 2;\n\n  if (query.length < minLength) return;\n\n  timeoutId = window.setTimeout(async () => {\n    if (query === qInput.value) {\n      await fetchResults(qInput, query);\n    }\n  }, 300);\n});\n\nconst autocomplete: HTMLElement | null = document.querySelector<HTMLElement>(\".autocomplete\");\nconst autocompleteList: HTMLUListElement | null = document.querySelector<HTMLUListElement>(\".autocomplete ul\");\nif (autocompleteList) {\n  listen(\"keyup\", qInput, (event: KeyboardEvent) => {\n    const listItems = [...autocompleteList.children] as HTMLElement[];\n\n    const currentIndex = listItems.findIndex((item) => item.classList.contains(\"active\"));\n    let newCurrentIndex = -1;\n\n    switch (event.key) {\n      case \"ArrowUp\": {\n        const currentItem = listItems[currentIndex];\n        if (currentItem && currentIndex >= 0) {\n          currentItem.classList.remove(\"active\");\n        }\n        // we need to add listItems.length to the index calculation here because the JavaScript modulos\n        // operator doesn't work with negative numbers\n        newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n        break;\n      }\n      case \"ArrowDown\": {\n        const currentItem = listItems[currentIndex];\n        if (currentItem && currentIndex >= 0) {\n          currentItem.classList.remove(\"active\");\n        }\n        newCurrentIndex = (currentIndex + 1) % listItems.length;\n        break;\n      }\n      case \"Tab\":\n      case \"Enter\":\n        if (autocomplete) {\n          autocomplete.classList.remove(\"open\");\n        }\n        break;\n      default:\n        break;\n    }\n\n    if (newCurrentIndex !== -1) {\n      const selectedItem = listItems[newCurrentIndex];\n      if (selectedItem) {\n        selectedItem.classList.add(\"active\");\n\n        if (!selectedItem.classList.contains(\"no-item-found\")) {\n          const qInput = document.getElementById(\"q\") as HTMLInputElement | null;\n          if (qInput) {\n            qInput.value = selectedItem.textContent ?? \"\";\n          }\n        }\n      }\n    }\n  });\n}\n"],"mappings":"0DAIA,IAAM,EAAe,MAAO,EAA0B,IAAiC,CACrF,GAAI,CACF,IAAIA,EAEA,EAAS,SAAW,MAChB,MAAM,EAAK,MAAO,qBAAqB,IAAQ,CAE/C,MAAM,EAAK,OAAQ,kBAAmB,CAAE,KAAM,IAAI,gBAAgB,CAAE,EAAG,EAAO,CAAC,CAAE,CAAC,CAGpF,EAAU,MAAM,EAAI,MAAM,CAE1B,EAAe,SAAS,cAA2B,gBAAgB,CACzE,EAAc,EAAa,CAE3B,IAAM,EAAmB,SAAS,cAAgC,mBAAmB,CAOrF,GANA,EAAc,EAAiB,CAE/B,EAAa,UAAU,IAAI,OAAO,CAClC,EAAiB,iBAAiB,CAG9B,IAAU,IAAI,SAAW,EAAG,CAC9B,IAAM,EAAqB,OAAO,OAAO,SAAS,cAAc,KAAK,CAAE,CACrE,UAAW,gBACX,YAAa,EAAS,cAAc,eAAiB,mBACtD,CAAC,CACF,EAAiB,OAAO,EAAmB,CAC3C,OAGF,IAAM,EAAW,IAAI,iBAErB,IAAK,IAAM,KAAU,EAAQ,GAAI,CAC/B,IAAM,EAAK,OAAO,OAAO,SAAS,cAAc,KAAK,CAAE,CAAE,YAAa,EAAQ,CAAC,CAE/E,EAAO,YAAa,MAAU,CAC5B,EAAO,MAAQ,EAEF,SAAS,cAA+B,UAAU,EACzD,QAAQ,CAEd,EAAa,UAAU,OAAO,OAAO,EACrC,CAEF,EAAS,OAAO,EAAG,CAGrB,EAAiB,OAAO,EAAS,OAC1B,EAAO,CACd,QAAQ,MAAM,uCAAwC,EAAM,GAI1D,EAAS,SAAS,eAAe,IAAI,CAC3C,EAAc,EAAO,CAErB,IAAIC,EAEJ,EAAO,QAAS,MAAc,CAC5B,aAAa,EAAU,CAEvB,IAAM,EAAQ,EAAO,MACf,EAAY,EAAS,kBAAoB,EAE3C,EAAM,OAAS,IAEnB,EAAY,OAAO,WAAW,SAAY,CACpC,IAAU,EAAO,OACnB,MAAM,EAAa,EAAQ,EAAM,EAElC,IAAI,GACP,CAEF,IAAMC,EAAmC,SAAS,cAA2B,gBAAgB,CACvFC,EAA4C,SAAS,cAAgC,mBAAmB,CAC1G,GACF,EAAO,QAAS,EAAS,GAAyB,CAChD,IAAM,EAAY,CAAC,GAAG,EAAiB,SAAS,CAE1C,EAAe,EAAU,UAAW,GAAS,EAAK,UAAU,SAAS,SAAS,CAAC,CACjF,EAAkB,GAEtB,OAAQ,EAAM,IAAd,CACE,IAAK,UAAW,CACd,IAAM,EAAc,EAAU,GAC1B,GAAe,GAAgB,GACjC,EAAY,UAAU,OAAO,SAAS,CAIxC,GAAmB,EAAe,EAAI,EAAU,QAAU,EAAU,OACpE,MAEF,IAAK,YAAa,CAChB,IAAM,EAAc,EAAU,GAC1B,GAAe,GAAgB,GACjC,EAAY,UAAU,OAAO,SAAS,CAExC,GAAmB,EAAe,GAAK,EAAU,OACjD,MAEF,IAAK,MACL,IAAK,QACC,GACF,EAAa,UAAU,OAAO,OAAO,CAEvC,MACF,QACE,MAGJ,GAAI,IAAoB,GAAI,CAC1B,IAAM,EAAe,EAAU,GAC/B,GAAI,IACF,EAAa,UAAU,IAAI,SAAS,CAEhC,CAAC,EAAa,UAAU,SAAS,gBAAgB,EAAE,CACrD,IAAM,EAAS,SAAS,eAAe,IAAI,CACvC,IACF,EAAO,MAAQ,EAAa,aAAe,OAKnD"}