FEATURE: Allow showing hashtag autocomplete results without term (#19219)

This commit allows us to type # in the UI and present autocomplete
results immediately with the following logic for the topic composer,
and reversed for the chat composer:

* Categories the user can access and has not muted sorted by `topic_count`
* Tags the user can access and has not muted sorted by `topic_count`
* Chat channels the user is a member of sorted by `messages_count`

So in effect, we allow searching for hashtags without a search term.
To do this we add a new `search_without_term` to each data source so
each one can define how it wants to handle this logic.
This commit is contained in:
Martin Brennan
2022-12-08 13:47:59 +10:00
committed by GitHub
parent fde9e6bc25
commit 3fdb8ffb57
12 changed files with 292 additions and 36 deletions

View File

@ -44,4 +44,27 @@ class Chat::ChatChannelHashtagDataSource
def self.search_sort(search_results, _)
search_results.sort_by { |result| result.text.downcase }
end
def self.search_without_term(guardian, limit)
if SiteSetting.enable_experimental_hashtag_autocomplete
allowed_channel_ids_sql =
Chat::ChatChannelFetcher.generate_allowed_channel_ids_sql(
guardian,
exclude_dm_channels: true,
)
ChatChannel
.joins(
"INNER JOIN user_chat_channel_memberships
ON user_chat_channel_memberships.chat_channel_id = chat_channels.id
AND user_chat_channel_memberships.user_id = #{guardian.user.id}
AND user_chat_channel_memberships.following = true",
)
.where("chat_channels.id IN (#{allowed_channel_ids_sql})")
.order(messages_count: :desc)
.limit(limit)
.map { |channel| channel_to_hashtag_item(guardian, channel) }
else
[]
end
end
end