Module: Formbuilder::Entry
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/formbuilder/entry.rb
Instance Method Summary collapse
-
#audit_responses ⇒ Object
Audits get run explicitly.
- #calculate_responses_text ⇒ Object
-
#calculate_sortable_values ⇒ Object
for manual use, maybe when migrating.
- #destroy_response(response_field) ⇒ Object
- #error_for(response_field) ⇒ Object
- #errors_on_page?(x) ⇒ Boolean
- #first_page_with_errors ⇒ Object
- #get_responses ⇒ Object
- #mark_responses_as_changed! ⇒ Object
-
#normalize_responses ⇒ Object
Normalizations get run before validation.
- #pages_with_errors ⇒ Object
- #response_value(response_field) ⇒ Object
- #responses_column ⇒ Object
- #responses_column=(x) ⇒ Object
- #responses_column_changed? ⇒ Boolean
- #responses_column_was ⇒ Object
- #save_response(raw_value, response_field, response_field_params = {}) ⇒ Object
- #save_responses(response_field_params, response_fields, opts = {}) ⇒ Object
- #set_responses(x) ⇒ Object
- #valid_page?(x) ⇒ Boolean
- #value_present?(response_field) ⇒ Boolean
Instance Method Details
#audit_responses ⇒ Object
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_text ⇒ Object
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_values ⇒ Object
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.[:"#{responses_column}_#{response_field.id}"]).first end |
#errors_on_page?(x) ⇒ 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_errors ⇒ Object
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_responses ⇒ Object
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_responses ⇒ Object
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_errors ⇒ Object
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_column ⇒ Object
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
76 77 78 |
# File 'lib/formbuilder/entry.rb', line 76 def responses_column_changed? send("#{responses_column}_changed?") end |
#responses_column_was ⇒ Object
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
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
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. && Array(response_field.["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 |