Skip to content

Commit

Permalink
Fixes #36711 - Fix name and description search in settings
Browse files Browse the repository at this point in the history
  • Loading branch information
girijaasoni committed Oct 17, 2023
1 parent d8200ee commit 9b3a76b
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
4 changes: 4 additions & 0 deletions app/models/setting.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ def self.per_page
20
end

def self.complete_for(search_query, opts = {})
Foreman.settings.complete_for(search_query, opts)
end

def self.[](name)
Foreman.settings[name]
end
Expand Down
2 changes: 1 addition & 1 deletion app/presenters/setting_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def matches_search_query?(query)
end

if query =~ /name\s*=\s*(\S+)/
name == tokenized.last
name == tokenized.last || full_name == tokenized.last
elsif query =~ /name\s*~\s*(\S+)/
search_value = tokenized.last
name.include?(search_value) || full_name&.include?(search_value)
Expand Down
56 changes: 56 additions & 0 deletions app/services/setting_registry.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,62 @@
class SettingRegistry
include Singleton
include Enumerable
extend ScopedSearch::ClassMethods

class SettingCompleter < ScopedSearch::AutoCompleteBuilder
def initialize(registry, definition, query, options)
@registry = registry
super(definition, query, options)
end

def self.auto_complete(registry, definition, query, options)
return [] if (query.nil? || definition.nil? || !definition.respond_to?(:fields))

new(registry, definition, query, options).build_autocomplete_options
end

def is_query_valid
true
end

def complete_value
if last_token_is(COMPARISON_OPERATORS)
token = tokens[tokens.size - 2]
val = ''
else
token = tokens[tokens.size - 3]
val = tokens[tokens.size - 1]
end

field = definition.field_by_name(token)
return [] unless field&.complete_value
return complete_set(field) if field.set?
return complete_key_value(field, token, val) if field.key_field

special_values = field.special_values.select { |v| v =~ /\A#{val}/ }
special_values + complete_value_from_db(field, special_values, val)
end

def complete_value_from_db(field, special_values, val)
count = 20 - special_values.count
if field.field == :name
results = @registry.map { |set| "\"#{set.full_name}\"" if set.name.include?(val) || set.full_name&.include?(val) }
elsif field.field == :description
results = []
else
raise ::Foreman::Exception.new N_('Unsupported completion, only name and description are supported')
end
results.first(count)
end
end

scoped_search :on => :id, :complete_enabled => false, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
scoped_search on: :name, complete_value: :true, operators: ['~', "="]
scoped_search on: :description, complete_value: :true, operators: ['~']

def complete_for(query, opts = {})
SettingCompleter.auto_complete(self, scoped_search_definition, query, opts)
end

def self.subset_registry(subset)
new(subset)
Expand Down

0 comments on commit 9b3a76b

Please sign in to comment.