From 921ad0c59af7edab70015dac2848ea3114a31876 Mon Sep 17 00:00:00 2001 From: mdashlw Date: Sun, 24 Mar 2024 18:38:23 +0300 Subject: [PATCH] Autocomplete fallback (#215) * autocomplete: fallback to fetch if local returns no results * fix: don't show autocomplete if by the time fetch is complete value had already changed * autocomplete tag controller: lower images count req from 4 to 1 --- assets/js/autocomplete.js | 13 ++++++++++--- .../controllers/autocomplete/tag_controller.ex | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/assets/js/autocomplete.js b/assets/js/autocomplete.js index 40d85dfb..c4809a7c 100644 --- a/assets/js/autocomplete.js +++ b/assets/js/autocomplete.js @@ -134,16 +134,19 @@ function listenAutocomplete() { document.addEventListener('input', event => { removeParent(); fetchLocalAutocomplete(event); + window.clearTimeout(timeout); if (localAc !== null && 'ac' in event.target.dataset) { inputField = event.target; originalTerm = `${inputField.value}`.toLowerCase(); const suggestions = localAc.topK(originalTerm, 5).map(({ name, imageCount }) => ({ label: `${name} (${imageCount})`, value: name })); - return showAutocomplete(suggestions, originalTerm, event.target); + + if (suggestions.length) { + return showAutocomplete(suggestions, originalTerm, event.target); + } } - window.clearTimeout(timeout); // Use a timeout to delay requests until the user has stopped typing timeout = window.setTimeout(() => { inputField = event.target; @@ -158,7 +161,11 @@ function listenAutocomplete() { } else { // inputField could get overwritten while the suggestions are being fetched - use event.target - getSuggestions(fetchedTerm).then(suggestions => showAutocomplete(suggestions, fetchedTerm, event.target)); + getSuggestions(fetchedTerm).then(suggestions => { + if (fetchedTerm === event.target.value) { + showAutocomplete(suggestions, fetchedTerm, event.target); + } + }); } } }, 300); diff --git a/lib/philomena_web/controllers/autocomplete/tag_controller.ex b/lib/philomena_web/controllers/autocomplete/tag_controller.ex index e4f9db52..9d43e470 100644 --- a/lib/philomena_web/controllers/autocomplete/tag_controller.ex +++ b/lib/philomena_web/controllers/autocomplete/tag_controller.ex @@ -30,7 +30,7 @@ defmodule PhilomenaWeb.Autocomplete.TagController do |> Elasticsearch.search_records(preload(Tag, :aliased_tag)) |> Enum.map(&(&1.aliased_tag || &1)) |> Enum.uniq_by(& &1.id) - |> Enum.filter(&(&1.images_count > 3)) + |> Enum.filter(&(&1.images_count > 0)) |> Enum.sort_by(&(-&1.images_count)) |> Enum.take(5) |> Enum.map(&%{label: "#{&1.name} (#{&1.images_count})", value: &1.name})