FEATURE: Generic hashtag autocomplete part 1 (#18592)

This commit adds a new `/hashtag/search` endpoint and both
relevant JS and ruby plugin APIs to handle plugins adding their
own data sources and priority orders for types of things to search
when `#` is pressed.

A `context` param is added to `setupHashtagAutocomplete` which
a corresponding chat PR https://github.com/discourse/discourse-chat/pull/1302
will now use.

The UI calls `registerHashtagSearchParam` for each context that will
require a `#` search (e.g. the topic composer), for each type of record that
the context needs to search for, as well as a priority order for that type. Core
uses this call to add the `category` and `tag` data sources to the topic composer.

The `register_hashtag_data_source` ruby plugin API call is for plugins to
add a new data source for the hashtag searching endpoint, e.g. discourse-chat
may add a `channel` data source.

This functionality is hidden behind the `enable_experimental_hashtag_autocomplete`
flag, except for the change to `setupHashtagAutocomplete` since only core and
discourse-chat are using that function. Note this PR does **not** include required
changes for hashtag lookup or new styling.
This commit is contained in:
Martin Brennan
2022-10-19 14:03:57 +10:00
committed by GitHub
parent 45bdfa1c84
commit 7c25597da2
13 changed files with 554 additions and 94 deletions

View File

@ -1086,6 +1086,16 @@ class Plugin::Instance
About.add_plugin_stat_group(plugin_stat_group_name, show_in_ui: show_in_ui, &block)
end
# Registers a new record type to be searched via the HashtagAutocompleteService and the
# /hashtags/search endpoint. The data returned by the block must be an array
# with each item an instance of HashtagAutocompleteService::HashtagItem.
#
# See also registerHashtagSearchParam in the plugin JS API, otherwise the
# clientside hashtag search code will use the new type registered here.
def register_hashtag_data_source(type, &block)
HashtagAutocompleteService.register_data_source(type, &block)
end
protected
def self.js_path