Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/events/public_registrations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
94 changes: 94 additions & 0 deletions app/services/base_registration_form_builder.rb
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
93 changes: 12 additions & 81 deletions app/services/extended_event_registration_form_builder.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class ExtendedEventRegistrationFormBuilder
class ExtendedEventRegistrationFormBuilder < BaseRegistrationFormBuilder
FORM_NAME = "Extended Event Registration"

def self.build_standalone!(include_contact_fields: true)
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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)
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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")

Expand All @@ -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
64 changes: 2 additions & 62 deletions app/services/scholarship_application_form_builder.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class ScholarshipApplicationFormBuilder
class ScholarshipApplicationFormBuilder < BaseRegistrationFormBuilder
FORM_NAME = "Scholarship Application"

def self.build_standalone!
Expand All @@ -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
Loading