Class: Plutonium::Resource::QueryObject

Inherits:
Object
  • Object
show all
Defined in:
lib/plutonium/resource/query_object.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource_class, params, request_path) {|_self| ... } ⇒ QueryObject

Initializes a QueryObject with the given resource_class and parameters.

Parameters:

  • resource_class (Object)

    The resource class.

  • params (Hash)

    The parameters for initialization.

Yields:

  • (_self)

Yield Parameters:



11
12
13
14
15
16
17
18
19
20
# File 'lib/plutonium/resource/query_object.rb', line 11

def initialize(resource_class, params, request_path, &)
  @resource_class = resource_class
  @params = params
  @request_path = request_path

  define_standard_queries
  yield self if block_given?
  extract_filter_params
  extract_sort_params
end

Instance Attribute Details

#default_scope_nameObject

Returns the value of attribute default_scope_name.



5
6
7
# File 'lib/plutonium/resource/query_object.rb', line 5

def default_scope_name
  @default_scope_name
end

#default_sort_configObject

Returns the value of attribute default_sort_config.



5
6
7
# File 'lib/plutonium/resource/query_object.rb', line 5

def default_sort_config
  @default_sort_config
end

#search_filterObject (readonly)

Returns the value of attribute search_filter.



4
5
6
# File 'lib/plutonium/resource/query_object.rb', line 4

def search_filter
  @search_filter
end

#search_queryObject (readonly)

Returns the value of attribute search_query.



4
5
6
# File 'lib/plutonium/resource/query_object.rb', line 4

def search_query
  @search_query
end

Instance Method Details

#all_scope_selected?Boolean

Returns true if user explicitly selected “All” scope (no filtering)

Returns:

  • (Boolean)


113
# File 'lib/plutonium/resource/query_object.rb', line 113

def all_scope_selected? = @all_scope_selected

#apply(scope, params, context: nil) ⇒ Object

Applies the defined filters and sorts to the given scope.

Parameters:

  • scope (Object)

    The initial scope to which filters and sorts are applied.

  • params (Hash)

    The query parameters.

  • context (Object) (defaults to: nil)

    Optional context (e.g., controller) for executing scope blocks.

Returns:

  • (Object)

    The modified scope.



100
101
102
103
104
105
106
107
108
# File 'lib/plutonium/resource/query_object.rb', line 100

def apply(scope, params, context: nil)
  params = deep_compact(params.with_indifferent_access)
  scope = search_filter.apply(scope, search: params[:search]) if search_filter && params[:search]
  # Use selected_scope which includes the default when no explicit selection
  effective_scope = @selected_scope_filter
  scope = scope_definitions[effective_scope].apply(scope, context:) if effective_scope && scope_definitions[effective_scope]
  scope = apply_sorts(scope, params)
  apply_filters(scope, params)
end

#build_url(**options) ⇒ String

Builds a URL with the given options for search and sorting.

Parameters:

  • options (Hash)

    The options for building the URL.

Returns:

  • (String)

    The constructed URL with query parameters.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/plutonium/resource/query_object.rb', line 67

def build_url(**options)
  q = {}

  q[:search] = options.key?(:search) ? options[:search].presence : search_query
  q[:scope] = if options.key?(:scope)
    options[:scope].presence
  else
    selected_scope_filter
  end

  q[:sort_directions] = selected_sort_directions.dup
  q[:sort_fields] = selected_sort_fields.dup
  handle_sort_options!(q, options)

  q.merge! params.slice(*filter_definitions.keys)
  compacted = deep_compact({q: q})

  # Preserve explicit "All" selection (scope: nil in options means show all)
  if options.key?(:scope) && options[:scope].nil?
    compacted[:q] ||= {}
    compacted[:q][:scope] = ""
  end

  query_params = compacted.to_param
  "#{@request_path}?#{query_params}"
end

#define_filter(name, body) ⇒ Object

Defines a filter with the given name and body.

Parameters:

  • name (Symbol)

    The name of the filter.

  • body (Proc, nil)

    The body of the filter.



26
27
28
# File 'lib/plutonium/resource/query_object.rb', line 26

def define_filter(name, body, &)
  filter_definitions[name] = build_query(body, &)
end

#define_scope(name, body = nil) ⇒ Object

Defines a scope with the given name and body.

Parameters:

  • name (Symbol)

    The name of the scope.

  • body (Proc, nil) (defaults to: nil)

    The body of the scope.



34
35
36
37
# File 'lib/plutonium/resource/query_object.rb', line 34

def define_scope(name, body = nil, **)
  body ||= name
  scope_definitions[name] = build_query(body)
end

#define_search(body) ⇒ Object

Defines a search filter with the given body.

Parameters:

  • body (Proc, Symbol)

    The body of the search filter.



57
58
59
60
61
# File 'lib/plutonium/resource/query_object.rb', line 57

def define_search(body)
  @search_filter = build_query(body) do |query|
    query.input :search
  end
end

#define_sorter(name, body = nil, using: nil) ⇒ Object

Defines a sort with the given name and body.

Parameters:

  • name (Symbol)

    The name of the sort.

  • body (Proc, nil) (defaults to: nil)

    The body of the sort.



43
44
45
46
47
48
49
50
51
52
# File 'lib/plutonium/resource/query_object.rb', line 43

def define_sorter(name, body = nil, using: nil)
  if body.nil?
    sort_field = using || determine_sort_field(name)
    body = ->(scope, direction:) { scope.order(sort_field => direction) }
  end

  sort_definitions[name] = build_query(body) do |query|
    query.input :direction
  end
end

#filter_definitionsObject



118
# File 'lib/plutonium/resource/query_object.rb', line 118

def filter_definitions = @filter_definitions ||= {}.with_indifferent_access

#scope_definitionsObject



110
# File 'lib/plutonium/resource/query_object.rb', line 110

def scope_definitions = @scope_definitions ||= {}.with_indifferent_access

#selected_scopeObject

Returns the currently selected scope (may be default if none explicitly selected)



116
# File 'lib/plutonium/resource/query_object.rb', line 116

def selected_scope = @selected_scope_filter

#sort_definitionsObject



120
# File 'lib/plutonium/resource/query_object.rb', line 120

def sort_definitions = @sort_definitions ||= {}.with_indifferent_access

#sort_params_for(name) ⇒ Hash?

Provides sorting parameters for the given field name.

Parameters:

  • name (Symbol, String)

    The name of the field to sort.

Returns:

  • (Hash, nil)

    The sorting parameters including URL and direction.



126
127
128
129
130
131
132
133
134
135
# File 'lib/plutonium/resource/query_object.rb', line 126

def sort_params_for(name)
  return unless sort_definitions[name]

  {
    url: build_url(sort: name),
    reset_url: build_url(sort: name, reset: true),
    position: selected_sort_fields.index(name.to_s),
    direction: selected_sort_directions[name]
  }
end