autocomplete: render html server-side.

Render the HTML for autocomplete results server-side instead of in
Javascript. This is cleaner than building HTML in Javascript, but it may
hurt caching because the HTTP responses are larger.

Fixes #4698: user autocomplete contains links to /posts

Also fixes a bug where tag counts in the autocomplete menu were different
from tag counts displayed elsewhere because of differences in rounding.
This commit is contained in:
evazion
2022-08-29 20:50:19 -05:00
parent 55266be2ef
commit cf13ab1540
7 changed files with 84 additions and 58 deletions

View File

@@ -48,6 +48,7 @@ class AutocompleteService
# @return [Array<Hash>] the autocomplete results
def autocomplete_results
return [] if !enabled?
return autocomplete_opensearch(query) if type == :opensearch
case type
when :tag_query
@@ -68,11 +69,9 @@ class AutocompleteService
autocomplete_favorite_group(query)
when :saved_search_label
autocomplete_saved_search_label(query)
when :opensearch
autocomplete_opensearch(query)
else
[]
end
end.map { |result| OpenStruct.new(result) }
end
# Complete a tag search (a regular tag or a metatag)
@@ -238,7 +237,7 @@ class AutocompleteService
pools = Pool.undeleted.name_matches(string).search(order: "post_count").limit(limit)
pools.map do |pool|
{ type: "pool", label: pool.pretty_name, value: pool.name, post_count: pool.post_count, category: pool.category }
{ type: "pool", label: pool.pretty_name, value: pool.name, id: pool.id, post_count: pool.post_count, category: pool.category }
end
end
@@ -298,7 +297,7 @@ class AutocompleteService
users = User.search(name_matches: string, current_user_first: true, order: "post_upload_count").limit(limit)
users.map do |user|
{ type: "user", label: user.pretty_name, value: user.name, level: user.level_string }
{ type: "user", label: user.pretty_name, value: user.name, id: user.id, level: user.level_string.downcase }
end
end