Module: Formbuilder::Entry

Extended by:
ActiveSupport::Concern
Defined in:
lib/formbuilder/entry.rb

Instance Method Summary collapse

Instance Method Details

#audit_responsesObject

Audits get run explicitly.



177
178
179
180
181
182
183
# File 'lib/formbuilder/entry.rb', line 177

def audit_responses
  form.response_fields.each do |response_field|
    response_field.audit_response(self.response_value(response_field), get_responses)
  end

  mark_responses_as_changed!
end

#calculate_responses_textObject



147
148
149
150
# File 'lib/formbuilder/entry.rb', line 147

def calculate_responses_text
  return unless self.respond_to?(:"#{responses_column}_text=")
  self.send(:"#{responses_column}_text=", get_responses.select { |k, v| Integer(k) rescue nil }.values.join(' '))
end

#calculate_sortable_valuesObject

for manual use, maybe when migrating



153
154
155
156
157
158
159
160
161
# File 'lib/formbuilder/entry.rb', line 153

def calculate_sortable_values
  response_fieldable.input_fields.each do |response_field|
    if (x = response_value(response_field)).present?
      get_responses["#{response_field.id}_sortable_value"] = response_field.sortable_value(x)
    end
  end

  mark_responses_as_changed!
end

#destroy_response(response_field) ⇒ Object



136
137
138
139
140
141
# File 'lib/formbuilder/entry.rb', line 136

def destroy_response(response_field)
  response_field.before_response_destroyed(self)
  id = response_field.id.to_s
  set_responses get_responses.reject { |k, v| k.in?([id, "#{id}_sortable_value"]) }
  mark_responses_as_changed!
end

#error_for(response_field) ⇒ Object



143
144
145
# File 'lib/formbuilder/entry.rb', line 143

def error_for(response_field)
  Array(self.errors.messages[:"#{responses_column}_#{response_field.id}"]).first
end

#errors_on_page?(x) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/formbuilder/entry.rb', line 52

def errors_on_page?(x)
  pages_with_errors[x - 1] # 0-indexed
end

#first_page_with_errorsObject



38
39
40
41
42
43
44
# File 'lib/formbuilder/entry.rb', line 38

def first_page_with_errors
  if (i = pages_with_errors.find_index { |x| x == true })
    i + 1
  else
    nil
  end
end

#get_responsesObject



64
65
66
# File 'lib/formbuilder/entry.rb', line 64

def get_responses
  send(responses_column)
end

#mark_responses_as_changed!Object



72
73
74
# File 'lib/formbuilder/entry.rb', line 72

def mark_responses_as_changed!
  send("#{responses_column}_will_change!")
end

#normalize_responsesObject

Normalizations get run before validation.



164
165
166
167
168
169
170
171
172
173
174
# File 'lib/formbuilder/entry.rb', line 164

def normalize_responses
  return if form.blank?

  form.response_fields.each do |response_field|
    if (x = self.response_value(response_field))
      response_field.normalize_response(x, get_responses)
    end
  end

  mark_responses_as_changed!
end

#pages_with_errorsObject



46
47
48
49
50
# File 'lib/formbuilder/entry.rb', line 46

def pages_with_errors
  form.response_fields_by_page.map do |page|
    page.find { |response_field| self.error_for(response_field).present? } ? true : false
  end
end

#response_value(response_field) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/formbuilder/entry.rb', line 101

def response_value(response_field)
  value = get_responses[response_field.id.to_s]

  if value
    response_field.serialized ? YAML::load(value) : value
  elsif !value && response_field.serialized && response_field.field_type != 'checkboxes'
    {}
  else # for checkboxes, we need to know the difference between no value and none selected
    nil
  end
end

#responses_columnObject



56
57
58
# File 'lib/formbuilder/entry.rb', line 56

def responses_column
  @responses_column || 'responses'
end

#responses_column=(x) ⇒ Object



60
61
62
# File 'lib/formbuilder/entry.rb', line 60

def responses_column=(x)
  @responses_column = x
end

#responses_column_changed?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/formbuilder/entry.rb', line 76

def responses_column_changed?
  send("#{responses_column}_changed?")
end

#responses_column_wasObject



80
81
82
# File 'lib/formbuilder/entry.rb', line 80

def responses_column_was
  send("#{responses_column}_was")
end

#save_response(raw_value, response_field, response_field_params = {}) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/formbuilder/entry.rb', line 122

def save_response(raw_value, response_field, response_field_params = {})
  value = response_field.transform_raw_value(raw_value, self, response_field_params: response_field_params)

  if value.present?
    get_responses["#{response_field.id}"] = response_field.serialized ? value.to_yaml : value
    get_responses["#{response_field.id}_sortable_value"] = response_field.sortable_value(value)
  else
    get_responses.delete("#{response_field.id}")
    get_responses.delete("#{response_field.id}_sortable_value")
  end

  mark_responses_as_changed!
end

#save_responses(response_field_params, response_fields, opts = {}) ⇒ Object



113
114
115
116
117
118
119
120
# File 'lib/formbuilder/entry.rb', line 113

def save_responses(response_field_params, response_fields, opts = {})
  set_responses({}) unless opts[:partial_update]
  response_field_params ||= {}

  response_fields.select { |rf| rf.input_field }.each do |response_field|
    self.save_response(response_field_params[response_field.id.to_s], response_field, response_field_params)
  end
end

#set_responses(x) ⇒ Object



68
69
70
# File 'lib/formbuilder/entry.rb', line 68

def set_responses(x)
  send("#{responses_column}=", x)
end

#valid_page?(x) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
36
# File 'lib/formbuilder/entry.rb', line 33

def valid_page?(x)
  self.valid?
  !self.errors_on_page?(x)
end

#value_present?(response_field) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/formbuilder/entry.rb', line 84

def value_present?(response_field)
  value = self.response_value(response_field)

  # value isn't blank (ignore hashes)
  return true if (value && value.present? && !value.is_a?(Hash))

  # no options are available
  return true if (response_field.options_field && Array(response_field.field_options["options"]).empty?)

  # there is at least one value (for hashes)
  # reject select fields
  return true if (value.is_a?(Hash) && value.reject { |k, v| k.in? ['am_pm', 'country'] }.find { |k, v| v.present? })

  # otherwise, it's not present
  return false
end