Module: Refine::Conditions::HasClauses

Included in:
BooleanCondition, Condition, DateCondition, FilterCondition, NumericCondition, OptionCondition, TextCondition
Defined in:
app/models/refine/conditions/has_clauses.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



4
5
6
7
8
# File 'app/models/refine/conditions/has_clauses.rb', line 4

def self.included(klass)
  klass.class_eval do
    mattr_accessor :default_clause_display_map, default: {}, instance_accessor: false
  end
end

Instance Method Details

#before_clause_validation(input = []) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'app/models/refine/conditions/has_clauses.rb', line 22

def before_clause_validation(input = [])
  proc do |input|
    if input.present?
      current_clause = clauses.select{ |clause| clause.id == input[:clause] }
      if current_clause.present?
        add_rules(current_clause[0].rules)
      end
    end
  end
end

#boot_has_clauses ⇒ Object



10
11
12
13
14
15
16
# File 'app/models/refine/conditions/has_clauses.rb', line 10

def boot_has_clauses
  @show_clauses = {}
  add_rules({ clause: "required" })
  with_meta({ clauses: get_clauses })
  add_ensurance(ensure_clauses)
  before_validate(before_clause_validation)
end

#clause_display_map ⇒ Object



18
19
20
# File 'app/models/refine/conditions/has_clauses.rb', line 18

def clause_display_map
  @clause_display_map ||= {}
end

#custom_clauses ⇒ Object



33
34
35
# File 'app/models/refine/conditions/has_clauses.rb', line 33

def custom_clauses
  []
end

#ensure_clause(clause) ⇒ Object



76
77
78
79
80
81
82
83
84
85
# File 'app/models/refine/conditions/has_clauses.rb', line 76

def ensure_clause(clause)
  if !clause.is_a? Clause
    errors.add(:base, I18n.t("refine.refine_blueprints.has_clauses.must_be_instance_of", instance: "#{Clause::class}"))
    raise Errors::ConditionClauseError, "#{errors.full_messages}"
  end
  if clause.id.blank? || clause.display.blank?
    errors.add(:base, I18n.t("refine.refine_blueprints.has_clauses.must_have_id_and_display"))
    raise Errors::ConditionClauseError, "#{errors.full_messages}"
  end
end

#ensure_clauses ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/refine/conditions/has_clauses.rb', line 64

def ensure_clauses
  proc do
    clauses = get_clauses.call
    if clauses.any?
      clauses.each { |clause| ensure_clause(clause) }
    else
      errors.add(:base, I18n.t("refine.refine_blueprints.has_clauses.not_determined"))
      raise Errors::ConditionClauseError, "#{errors.full_messages}"
    end
  end
end

#get_clause_by_id(id) ⇒ Object



87
88
89
90
91
# File 'app/models/refine/conditions/has_clauses.rb', line 87

def get_clause_by_id(id)
  clause = get_clauses.call().find{ |clause| clause.id == id }
  raise I18n.t("refine.refine_blueprints.has_clauses.not_found", id: id) unless clause
  clause
end

#get_clauses ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'app/models/refine/conditions/has_clauses.rb', line 93

def get_clauses
  proc do
    returned_clauses = clauses.dup
    # Clause display map takes precedence over default display map. Merge order matters.
    map = self.class.default_clause_display_map.merge(clause_display_map)
    @show_clauses.each do |clause_id, rule|
      filterable_clause_index = returned_clauses.index{ |clause| clause.id.to_sym == clause_id }
      if rule == false
        returned_clauses.delete_at(filterable_clause_index)
      elsif rule == true
        add_clause = returned_clauses.find{|clause| clause.id.to_sym == clause_id }
        returned_clauses << add_clause if !add_clause
      end
    end
    # Rewrite display if the key exists in the map.
    returned_clauses.each do |clause|
      if map.key?(clause.id.to_sym)
        clause.display = map[clause.id.to_sym]
      end
    end
    returned_clauses
  end
end

#only_clauses(specific_clauses) ⇒ Object



42
43
44
45
46
47
48
# File 'app/models/refine/conditions/has_clauses.rb', line 42

def only_clauses(specific_clauses)
  # Remove all clauses
  clauses.map(&:id).each {|clause_id| update_show_clauses(clause_id, false) }
  # Add specific clauses by id, not by fully qualified clause
  specific_clauses.each {|clause| update_show_clauses(clause, true) }
  self
end

#remap_clause_displays(map) ⇒ Object



37
38
39
40
# File 'app/models/refine/conditions/has_clauses.rb', line 37

def remap_clause_displays(map)
  clause_display_map.merge!(map)
  self
end

#update_show_clauses(clause, value) ⇒ Object



60
61
62
# File 'app/models/refine/conditions/has_clauses.rb', line 60

def update_show_clauses(clause, value)
  @show_clauses.merge!({"#{clause}": value})
end

#with_clauses(clauses_to_include) ⇒ Object



50
51
52
53
# File 'app/models/refine/conditions/has_clauses.rb', line 50

def with_clauses(clauses_to_include)
  clauses_to_include.each {|clause| update_show_clauses(clause, true) }
  self
end

#without_clauses(clauses_to_exclude) ⇒ Object



55
56
57
58
# File 'app/models/refine/conditions/has_clauses.rb', line 55

def without_clauses(clauses_to_exclude)
  clauses_to_exclude.each {|clause| update_show_clauses(clause, false) }
  self
end