diff --git a/app/controllers/events/public_registrations_controller.rb b/app/controllers/events/public_registrations_controller.rb index ade7bfcec..d9dd62012 100644 --- a/app/controllers/events/public_registrations_controller.rb +++ b/app/controllers/events/public_registrations_controller.rb @@ -142,7 +142,7 @@ def validate_required_fields(form_params) if field.number_integer? && value.to_s !~ /\A\d+\z/ errors[field.id] = "must be a whole number" - elsif field.field_key&.match?(/email(?!_type)/) && value.to_s !~ /\A[^@\s]+@[^@\s]+\z/ + elsif field.field_key&.match?(/email(?!_type|_confirmation)/) && value.to_s !~ /\A[^@\s]+@[^@\s]+\z/ errors[field.id] = "must be a valid email address" end end diff --git a/app/services/base_registration_form_builder.rb b/app/services/base_registration_form_builder.rb new file mode 100644 index 000000000..64c2b9ad8 --- /dev/null +++ b/app/services/base_registration_form_builder.rb @@ -0,0 +1,94 @@ +class BaseRegistrationFormBuilder + protected + + def build_basic_contact_fields(form, position) + position = add_field(form, position, "First Name", :free_form_input_one_line, + key: "first_name", group: "contact", required: true) + position = add_field(form, position, "Last Name", :free_form_input_one_line, + key: "last_name", group: "contact", required: true) + position = add_field(form, position, "Email", :free_form_input_one_line, + key: "primary_email", group: "contact", required: true) + position = add_field(form, position, "Confirm Email", :free_form_input_one_line, + key: "confirm_email", group: "contact", required: true) + + position + end + + def build_scholarship_fields(form, position) + position = add_header(form, position, "Scholarship Application", group: "scholarship") + + position = add_field(form, position, + "I / my agency cannot afford the full training cost and need a scholarship to attend.", + :multiple_choice_checkbox, + key: "scholarship_eligibility", group: "scholarship", required: true, + options: [ "Yes" ]) + position = add_field(form, position, + "How will what you gain from this training directly impact the people you serve?", + :free_form_input_paragraph, + key: "impact_description", group: "scholarship", required: true, + hint: "Please describe in 3-5+ sentences.") + position = add_field(form, position, + "Please describe one way in which you plan to use art workshops and how you envision it will help.", + :free_form_input_paragraph, + key: "implementation_plan", group: "scholarship", required: true, + hint: "Please describe in 3-5+ sentences.") + position = add_field(form, position, "Anything else you'd like to share with us?", :free_form_input_paragraph, + key: "additional_comments", group: "scholarship", required: false) + + position + end + + def build_consent_fields(form, position) + position = add_header(form, position, "Consent", group: "consent") + position = add_field(form, position, + "I agree to receive email communications from A Window Between Worlds.", + :multiple_choice_radio, + key: "communication_consent", group: "consent", required: true, + hint: "By submitting this form, I consent to receive updates from A Window Between Worlds, " \ + "including information about this event as well as upcoming events, training opportunities, resources, " \ + "impact stories, and ways to support our mission. I understand I can unsubscribe at any time.", + options: %w[Yes No]) + + position + end + + def add_header(form, position, title, group:) + position += 1 + form.form_fields.create!( + question: title, + answer_type: :group_header, + status: :active, + position: position, + is_required: false, + field_key: nil, + field_group: group + ) + position + end + + def add_field(form, position, question, answer_type, key:, group:, required: true, hint: nil, options: nil, datatype: nil) + position += 1 + field = form.form_fields.create!( + question: question, + answer_type: answer_type, + answer_datatype: datatype, + status: :active, + position: position, + is_required: required, + instructional_hint: hint, + field_key: key, + field_group: group + ) + + if options.present? + options.each_with_index do |opt, idx| + ao = AnswerOption.find_or_create_by!(name: opt) do |a| + a.position = idx + end + field.form_field_answer_options.create!(answer_option: ao) + end + end + + position + end +end diff --git a/app/services/event_registration_services/public_registration.rb b/app/services/event_registration_services/public_registration.rb index af5b734e7..c681a75dd 100644 --- a/app/services/event_registration_services/public_registration.rb +++ b/app/services/event_registration_services/public_registration.rb @@ -123,7 +123,7 @@ def create_mailing_address(person) state: new_state, zip_code: field_value("mailing_zip"), locality: "Unknown", - address_type: "mailing", + address_type: field_value("mailing_address_type")&.downcase || "mailing", primary: true ) end @@ -252,6 +252,7 @@ def update_person_form(person) def save_form_fields(person_form) @form.form_fields.where(status: :active).find_each do |field| next if field.group_header? + next if field.field_key == "confirm_email" raw_value = @form_params[field.id.to_s] text = if raw_value.is_a?(Array) diff --git a/app/services/extended_event_registration_form_builder.rb b/app/services/extended_event_registration_form_builder.rb index 9a7e2678b..f6e093eac 100644 --- a/app/services/extended_event_registration_form_builder.rb +++ b/app/services/extended_event_registration_form_builder.rb @@ -1,4 +1,4 @@ -class ExtendedEventRegistrationFormBuilder +class ExtendedEventRegistrationFormBuilder < BaseRegistrationFormBuilder FORM_NAME = "Extended Event Registration" def self.build_standalone!(include_contact_fields: true) @@ -58,7 +58,8 @@ def build_fields!(form) position = build_professional_fields(form, position) position = build_qualitative_fields(form, position) position = build_scholarship_fields(form, position) - build_payment_fields(form, position) + position = build_payment_fields(form, position) + build_consent_fields(form, position) form end @@ -68,19 +69,15 @@ def build_fields!(form) def build_contact_fields(form, position) position = add_header(form, position, "Contact Information", group: "contact") - position = add_field(form, position, "First Name", :free_form_input_one_line, - key: "first_name", group: "contact", required: true) - position = add_field(form, position, "Last Name", :free_form_input_one_line, - key: "last_name", group: "contact", required: true) + position = build_basic_contact_fields(form, position) + + position = add_field(form, position, "Primary Email Type", :multiple_choice_radio, + key: "primary_email_type", group: "contact", required: true, + options: %w[Personal Work]) position = add_field(form, position, "Preferred Nickname", :free_form_input_one_line, key: "nickname", group: "contact", required: false) position = add_field(form, position, "Pronouns", :free_form_input_one_line, key: "pronouns", group: "contact", required: false) - position = add_field(form, position, "Primary Email", :free_form_input_one_line, - key: "primary_email", group: "contact", required: true) - position = add_field(form, position, "Primary Email Type", :multiple_choice_radio, - key: "primary_email_type", group: "contact", required: true, - options: %w[Personal Work]) position = add_field(form, position, "Secondary Email", :free_form_input_one_line, key: "secondary_email", group: "contact", required: false) position = add_field(form, position, "Secondary Email Type", :multiple_choice_radio, @@ -90,15 +87,15 @@ def build_contact_fields(form, position) position = add_header(form, position, "Mailing Address", group: "contact") position = add_field(form, position, "Street Address", :free_form_input_one_line, key: "mailing_street", group: "contact", required: true) + position = add_field(form, position, "Address Type", :multiple_choice_radio, + key: "mailing_address_type", group: "contact", required: true, + options: %w[Home Work]) position = add_field(form, position, "City", :free_form_input_one_line, key: "mailing_city", group: "contact", required: true) position = add_field(form, position, "State / Province", :free_form_input_one_line, key: "mailing_state", group: "contact", required: true) position = add_field(form, position, "Zip / Postal Code", :free_form_input_one_line, key: "mailing_zip", group: "contact", required: true) - position = add_field(form, position, "Mailing Address Type", :multiple_choice_radio, - key: "mailing_address_type", group: "contact", required: true, - options: %w[Work Personal]) position = add_field(form, position, "Phone", :free_form_input_one_line, key: "phone", group: "contact", required: true) @@ -149,7 +146,7 @@ def build_professional_fields(form, position) key: "primary_service_area", group: "professional", required: false, hint: "Select all that apply. These represent the sectors you primarily serve.") position = add_field(form, position, "Workshop Settings", :multiple_choice_checkbox, - key: "workshop_settings", group: "professional", required: false, + key: "workshop_environments", group: "professional", required: false, hint: "Select all settings where you facilitate or plan to facilitate workshops.", options: [ "Clinical", "Educational", "Events / conferences", @@ -182,30 +179,6 @@ def build_qualitative_fields(form, position) position end - def build_scholarship_fields(form, position) - position = add_header(form, position, "Scholarship Application", group: "scholarship") - - position = add_field(form, position, - "I / my agency cannot afford the full training cost and need a scholarship to attend.", - :multiple_choice_checkbox, - key: "scholarship_eligibility", group: "scholarship", required: true, - options: [ "Yes" ]) - position = add_field(form, position, - "How will what you gain from this training directly impact the people you serve?", - :free_form_input_paragraph, - key: "impact_description", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - position = add_field(form, position, - "Please describe one way in which you plan to use art workshops and how you envision it will help.", - :free_form_input_paragraph, - key: "implementation_plan", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - position = add_field(form, position, "Anything else you'd like to share with us?", :free_form_input_paragraph, - key: "additional_comments", group: "scholarship", required: false) - - position - end - def build_payment_fields(form, position) position = add_header(form, position, "Payment Information", group: "payment") @@ -219,46 +192,4 @@ def build_payment_fields(form, position) position end - - # --- helpers --- - - def add_header(form, position, title, group:) - position += 1 - form.form_fields.create!( - question: title, - answer_type: :group_header, - status: :active, - position: position, - is_required: false, - field_key: nil, - field_group: group - ) - position - end - - def add_field(form, position, question, answer_type, key:, group:, required: true, hint: nil, options: nil, datatype: nil) - position += 1 - field = form.form_fields.create!( - question: question, - answer_type: answer_type, - answer_datatype: datatype, - status: :active, - position: position, - is_required: required, - instructional_hint: hint, - field_key: key, - field_group: group - ) - - if options.present? - options.each_with_index do |opt, idx| - ao = AnswerOption.find_or_create_by!(name: opt) do |a| - a.position = idx - end - field.form_field_answer_options.create!(answer_option: ao) - end - end - - position - end end diff --git a/app/services/scholarship_application_form_builder.rb b/app/services/scholarship_application_form_builder.rb index 10331fc2a..b0e42c382 100644 --- a/app/services/scholarship_application_form_builder.rb +++ b/app/services/scholarship_application_form_builder.rb @@ -1,4 +1,4 @@ -class ScholarshipApplicationFormBuilder +class ScholarshipApplicationFormBuilder < BaseRegistrationFormBuilder FORM_NAME = "Scholarship Application" def self.build_standalone! @@ -15,67 +15,7 @@ def self.build!(event) end def build_fields!(form) - position = 0 - - position = add_header(form, position, "Scholarship Application", group: "scholarship") - - position = add_field(form, position, - "I / my agency cannot afford the full training cost and need a scholarship to attend.", - :multiple_choice_checkbox, - key: "scholarship_eligibility", group: "scholarship", required: true, - options: [ "Yes" ]) - position = add_field(form, position, - "How will what you gain from this training directly impact the people you serve?", - :free_form_input_paragraph, - key: "impact_description", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - position = add_field(form, position, - "Please describe one way in which you plan to use art workshops and how you envision it will help.", - :free_form_input_paragraph, - key: "implementation_plan", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - add_field(form, position, "Anything else you'd like to share with us?", :free_form_input_paragraph, - key: "additional_comments", group: "scholarship", required: false) - + build_scholarship_fields(form, 0) form end - - private - - def add_header(form, position, title, group:) - position += 1 - form.form_fields.create!( - question: title, - answer_type: :group_header, - status: :active, - position: position, - is_required: false, - field_key: nil, - field_group: group - ) - position - end - - def add_field(form, position, question, answer_type, key:, group:, required: true, hint: nil, options: nil) - position += 1 - field = form.form_fields.create!( - question: question, - answer_type: answer_type, - status: :active, - position: position, - is_required: required, - instructional_hint: hint, - field_key: key, - field_group: group - ) - - if options.present? - options.each_with_index do |opt, idx| - ao = AnswerOption.find_or_create_by!(name: opt) { |a| a.position = idx } - field.form_field_answer_options.create!(answer_option: ao) - end - end - - position - end end diff --git a/app/services/short_event_registration_form_builder.rb b/app/services/short_event_registration_form_builder.rb index 7d5ec291f..900d4c6f9 100644 --- a/app/services/short_event_registration_form_builder.rb +++ b/app/services/short_event_registration_form_builder.rb @@ -1,4 +1,4 @@ -class ShortEventRegistrationFormBuilder +class ShortEventRegistrationFormBuilder < BaseRegistrationFormBuilder FORM_NAME = "Short Event Registration" def self.build_standalone! @@ -17,22 +17,17 @@ def self.build!(event) def build_fields!(form) position = 0 - position = add_field(form, position, "First Name", :free_form_input_one_line, - key: "first_name", group: "contact", required: true) - position = add_field(form, position, "Last Name", :free_form_input_one_line, - key: "last_name", group: "contact", required: true) - position = add_field(form, position, "Enter Email", :free_form_input_one_line, - key: "primary_email", group: "contact", required: true) - position = add_field(form, position, "Confirm Email", :free_form_input_one_line, - key: "confirm_email", group: "contact", required: true) + position = build_basic_contact_fields(form, position) + position = build_consent_fields(form, position) + position = build_qualitative_fields(form, position) + position = build_scholarship_fields(form, position) + + position + end - position = add_field(form, position, "Consent", :multiple_choice_checkbox, - key: "consent", group: "consent", required: true, - hint: "By submitting this form, I consent to receive updates from A Window Between Worlds, " \ - "including information about this event as well as upcoming events, training opportunities, resources, " \ - "impact stories, and ways to support our mission. I understand I can unsubscribe at any time.", - options: [ "I agree to receive email communications from A Window Between Worlds." ]) + private + def build_qualitative_fields(form, position) position = add_field(form, position, "How did you hear about this event?", :multiple_choice_checkbox, key: "referral_source", group: "qualitative", required: true, options: [ "AWBW Email", "Facebook", "Instagram", "LinkedIn", "Online Search", "Word of Mouth", "Other" ]) @@ -42,71 +37,6 @@ def build_fields!(form) key: "training_interest", group: "qualitative", required: true, options: [ "Yes", "Not right now" ]) - position = build_scholarship_fields(form, position) - - position - end - - private - - def build_scholarship_fields(form, position) - position = add_header(form, position, "Scholarship Application", group: "scholarship") - - position = add_field(form, position, - "I / my agency cannot afford the full training cost and need a scholarship to attend.", - :multiple_choice_checkbox, - key: "scholarship_eligibility", group: "scholarship", required: true, - options: [ "Yes" ]) - position = add_field(form, position, - "How will what you gain from this training directly impact the people you serve?", - :free_form_input_paragraph, - key: "impact_description", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - position = add_field(form, position, - "Please describe one way in which you plan to use art workshops and how you envision it will help.", - :free_form_input_paragraph, - key: "implementation_plan", group: "scholarship", required: true, - hint: "Please describe in 3-5+ sentences.") - position = add_field(form, position, "Anything else you'd like to share with us?", :free_form_input_paragraph, - key: "additional_comments", group: "scholarship", required: false) - - position - end - - def add_header(form, position, title, group:) - position += 1 - form.form_fields.create!( - question: title, - answer_type: :group_header, - status: :active, - position: position, - is_required: false, - field_key: nil, - field_group: group - ) - position - end - - def add_field(form, position, question, answer_type, key:, group:, required: true, hint: nil, options: nil) - position += 1 - field = form.form_fields.create!( - question: question, - answer_type: answer_type, - status: :active, - position: position, - is_required: required, - instructional_hint: hint, - field_key: key, - field_group: group - ) - - if options.present? - options.each_with_index do |opt, idx| - ao = AnswerOption.find_or_create_by!(name: opt) { |a| a.position = idx } - field.form_field_answer_options.create!(answer_option: ao) - end - end - position end end diff --git a/app/views/events/public_registrations/_form_field.html.erb b/app/views/events/public_registrations/_form_field.html.erb index d5fe9730f..9cf64881d 100644 --- a/app/views/events/public_registrations/_form_field.html.erb +++ b/app/views/events/public_registrations/_form_field.html.erb @@ -1,4 +1,4 @@ -<%# locals: (field:, value: nil) %> +<%# locals: (field:, value: nil, label: nil) %> <% return if field.group_header? %> <% error = @field_errors&.dig(field.id) %> @@ -6,7 +6,7 @@