Module: Ditty::Helpers::Component

Includes:
ActiveSupport::Inflector
Defined in:
lib/ditty/helpers/component.rb

Instance Method Summary collapse

Instance Method Details

#apply_filter(dataset, filter) ⇒ Object



60
61
62
63
64
65
# File 'lib/ditty/helpers/component.rb', line 60

def apply_filter(dataset, filter)
  value = params[filter[:name].to_s].send(filter[:modifier])
  return dataset.where(filter[:field] => value) unless filter[:field].to_s.include? '.'

  dataset.where(filter_field(filter) => filter_value(filter))
end

#datasetObject



12
13
14
# File 'lib/ditty/helpers/component.rb', line 12

def dataset
  search(filtered(policy_scope(settings.model_class)))
end

#dehumanizedObject



38
39
40
# File 'lib/ditty/helpers/component.rb', line 38

def dehumanized
  settings.dehumanized || underscore(heading)
end

#filter_association(filter) ⇒ Object



79
80
81
82
83
84
# File 'lib/ditty/helpers/component.rb', line 79

def filter_association(filter)
  assoc = filter[:field].to_s.split('.').first.to_sym
  assoc = settings.model_class.association_reflection(assoc)
  raise "Unknown association #{assoc}" if assoc.nil?
  assoc
end

#filter_field(filter) ⇒ Object



67
68
69
# File 'lib/ditty/helpers/component.rb', line 67

def filter_field(filter)
  filter[:field].to_s.split('.').first.to_sym
end

#filter_value(filter) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/ditty/helpers/component.rb', line 71

def filter_value(filter)
  field = filter[:field].to_s.split('.').last.to_sym
  assoc = filter_association(filter)
  value = params[filter[:name].to_s].send(filter[:modifier])
  value = assoc.associated_dataset.first(field => value)
  value.nil? ? assoc.associated_class.new : value
end

#filtered(dataset) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/ditty/helpers/component.rb', line 50

def filtered(dataset)
  filters.each do |filter|
    next if [nil, ''].include? params[filter[:name].to_s]
    filter[:field] ||= filter[:name]
    filter[:modifier] ||= :to_s
    dataset = apply_filter(dataset, filter)
  end
  dataset
end

#filtersObject



42
43
44
# File 'lib/ditty/helpers/component.rb', line 42

def filters
  self.class.const_defined?('FILTERS') ? self.class::FILTERS : []
end

#heading(action = nil) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/ditty/helpers/component.rb', line 26

def heading(action = nil)
  @headings ||= begin
    heading = settings.model_class.to_s.demodulize.titleize
    h = Hash.new(heading)
    h[:new] = "New #{heading}"
    h[:list] = pluralize heading
    h[:edit] = "Edit #{heading}"
    h
  end
  @headings[action]
end

#listObject



16
17
18
19
20
21
22
23
24
# File 'lib/ditty/helpers/component.rb', line 16

def list
  count = params['count'] || 10
  page = params['page'] || 1

  ds = dataset.respond_to?(:dataset) ? dataset.dataset : dataset
  return ds if count == 'all'
  # Account for difference between sequel paginate and will paginate
  ds.is_a?(Array) ? ds.paginate(page: page.to_i, per_page: count.to_i) : ds.paginate(page.to_i, count.to_i)
end

#search(dataset) ⇒ Object



90
91
92
93
# File 'lib/ditty/helpers/component.rb', line 90

def search(dataset)
  return dataset if ['', nil].include?(params['q']) || search_filters == []
  dataset.where Sequel.|(*search_filters)
end

#search_filtersObject



86
87
88
# File 'lib/ditty/helpers/component.rb', line 86

def search_filters
  searchable_fields.map { |f| Sequel.ilike(f.to_sym, "%#{params[:q]}%") }
end

#searchable_fieldsObject



46
47
48
# File 'lib/ditty/helpers/component.rb', line 46

def searchable_fields
  self.class.const_defined?('SEARCHABLE') ? self.class::SEARCHABLE : []
end