Class: Panda::Core::SearchRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/panda/core/search_registry.rb

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.providersObject (readonly)

Returns the value of attribute providers.



9
10
11
# File 'lib/panda/core/search_registry.rb', line 9

def providers
  @providers
end

Class Method Details

.admin_search(query, limit: 5) ⇒ Hash

Search all registered providers (admin format with grouping)

Parameters:

  • query (String)

    Search query

  • limit (Integer) (defaults to: 5)

    Max results per provider

Returns:

  • (Hash)

    { groups: [{ name:, icon:, results: [{ href:, name:, description: }] }] }



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/panda/core/search_registry.rb', line 39

def admin_search(query, limit: 5)
  return {groups: []} if query.blank?

  groups = @providers.filter_map do |provider|
    klass = provider[:search_class]
    next unless klass.respond_to?(:admin_search)

    results = klass.admin_search(query, limit: limit)
    next if results.empty?

    config = klass.respond_to?(:searchable_config) ? klass.searchable_config : {}
    {
      name: config[:group] || provider[:name].to_s.titleize,
      icon: config[:icon],
      results: results
    }
  rescue => e
    Rails.logger.warn("[panda-core] Admin search provider #{provider[:name]} failed: #{e.message}") if defined?(Rails.logger)
    nil
  end

  {groups: groups}
end

.register(name:, search_class:) ⇒ Object

Register a search provider (idempotent — overwrites any existing provider with the same name)

Parameters:

  • name (String)

    Provider name (e.g., "pages", "posts")

  • search_class (Class)

    Class that responds to .editor_search(query, limit:) and optionally .admin_search(query, limit:) for richer global search results



15
16
17
18
# File 'lib/panda/core/search_registry.rb', line 15

def register(name:, search_class:)
  @providers.reject! { |p| p[:name] == name }
  @providers << {name: name, search_class: search_class}
end

.reset!Object



63
64
65
# File 'lib/panda/core/search_registry.rb', line 63

def reset!
  @providers = []
end

.search(query, limit: 5) ⇒ Array<Hash>

Search all registered providers (editor format)

Parameters:

  • query (String)

    Search query

  • limit (Integer) (defaults to: 5)

    Max results per provider

Returns:

  • (Array<Hash>)

    Array of { href:, name:, description: }



24
25
26
27
28
29
30
31
32
33
# File 'lib/panda/core/search_registry.rb', line 24

def search(query, limit: 5)
  return [] if query.blank?

  @providers.flat_map do |provider|
    provider[:search_class].editor_search(query, limit: limit)
  rescue => e
    Rails.logger.warn("[panda-core] Search provider #{provider[:name]} failed: #{e.message}") if defined?(Rails.logger)
    []
  end
end