Class: Kadmin::Finder

Inherits:
Object
  • Object
show all
Includes:
Presentable
Defined in:
app/components/kadmin/finder.rb,
app/components/kadmin/finder/filter.rb,
app/components/kadmin/finder/presenter.rb

Defined Under Namespace

Classes: Filter, Presenter

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Presentable

#present

Constructor Details

#initialize(scope) ⇒ Finder

Returns a new instance of Finder.

Parameters:

  • scope (ActiveRecord::Relation)

    base relation to page/filter on



23
24
25
26
27
28
29
30
# File 'app/components/kadmin/finder.rb', line 23

def initialize(scope)
  @scope = scope
  @pager = nil
  @filters = {}
  @results = nil
  @filtering = false
  @sort_asc = true
end

Instance Attribute Details

#filtersHash<String, Kadmin::Finder::Filter> (readonly)

Returns array of filters applied to the finder.

Returns:



11
12
13
# File 'app/components/kadmin/finder.rb', line 11

def filters
  @filters
end

#pagerKadmin::Pager (readonly)

Returns the pager to use (if any).

Returns:



8
9
10
# File 'app/components/kadmin/finder.rb', line 8

def pager
  @pager
end

#scopeActiveRecord::Relation (readonly)

Returns the base relation to find items from.

Returns:

  • (ActiveRecord::Relation)

    the base relation to find items from



14
15
16
# File 'app/components/kadmin/finder.rb', line 14

def scope
  @scope
end

#sort_ascbool (readonly)

Returns true if sort order is ASC, false if DESC.

Returns:

  • (bool)

    true if sort order is ASC, false if DESC



20
21
22
# File 'app/components/kadmin/finder.rb', line 20

def sort_asc
  @sort_asc
end

#sort_columnString (readonly)

Returns name of column that is used in ORDER_BY clause.

Returns:

  • (String)

    name of column that is used in ORDER_BY clause



17
18
19
# File 'app/components/kadmin/finder.rb', line 17

def sort_column
  @sort_column
end

Instance Method Details

#filter(filter, value = nil) ⇒ Object

Parameters:

  • name (String)

    the filter name (should be unique)

  • column (String, Array<String>)

    the column(s) name to filter on

  • value (String, Array<String>) (defaults to: nil)

    the value or values to look for (OR’d)



35
36
37
38
39
40
41
42
43
# File 'app/components/kadmin/finder.rb', line 35

def filter(filter, value = nil)
  @filters[filter.name] = filter
  if value.present?
    @filtering = true
    @scope = filter.apply(@scope, value)
  end

  return self
end

#filtering?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'app/components/kadmin/finder.rb', line 54

def filtering?
  return @filtering
end

#find!Object

Forces to refetch/recalculate the find operation results



83
84
85
86
87
# File 'app/components/kadmin/finder.rb', line 83

def find!
  @total_found = 0
  @results = nil
  return results
end

#order(sort_column, sort_asc) ⇒ Object

sets sort order for scope, any existing order is overwritten

Parameters:

  • name (String)

    of column to sort

  • true (bool)

    for ASC sort, false otherwise



48
49
50
51
52
# File 'app/components/kadmin/finder.rb', line 48

def order(sort_column, sort_asc)
  @sort_column = sort_column
  @sort_asc = sort_asc
  @scope = @scope.reorder("#{sort_column} #{sort_asc ? 'ASC' : 'DESC'}")
end

#paginate(offset: nil, size: nil) ⇒ Kadmin::Finder

Returns itself.

Parameters:

  • offset (Integer) (defaults to: nil)

    optional; offset/index for the current page

  • size (Integer) (defaults to: nil)

    optional; size of a page

Returns:



61
62
63
64
65
66
67
68
69
70
# File 'app/components/kadmin/finder.rb', line 61

def paginate(offset: nil, size: nil)
  offset = offset.to_i
  size = size.to_i

  if size.positive? && offset >= 0
    @pager = Kadmin::Pager.new(size: size, offset: offset)
  end

  return self
end

#resultsActiveRecord::Relation

Returns the filtered (and optionally paginated) results.

Returns:

  • (ActiveRecord::Relation)

    the filtered (and optionally paginated) results



73
74
75
76
77
78
79
80
# File 'app/components/kadmin/finder.rb', line 73

def results
  return @results ||= begin
    results = @scope
    results = @pager.paginate(results) unless @pager.nil?
    results.load
    results
  end
end