diff --git a/app/assets/stylesheets/nvra.scss b/app/assets/stylesheets/nvra.scss index 206c09a06..e5bac405c 100644 --- a/app/assets/stylesheets/nvra.scss +++ b/app/assets/stylesheets/nvra.scss @@ -196,6 +196,7 @@ span.smaller_prompt { h4 { text-transform:uppercase; font-size:.7 * $fs; + line-height: 1.8; a { text-transform:none; } diff --git a/app/controllers/abrs_controller.rb b/app/controllers/abrs_controller.rb index ec697e4e5..dffe4e806 100644 --- a/app/controllers/abrs_controller.rb +++ b/app/controllers/abrs_controller.rb @@ -76,7 +76,7 @@ def state_online_redirect @abr.update_attributes(:finish_with_state=>true) render :html => "
".html_safe end - + def update @abr = Abr.find_by_uid(params[:id]) set_up_locale diff --git a/app/mailers/notifier.rb b/app/mailers/notifier.rb index 9afd72426..da37f896e 100644 --- a/app/mailers/notifier.rb +++ b/app/mailers/notifier.rb @@ -31,7 +31,7 @@ def partner_terms_of_use(partner) @privacy_url = "https://www.rockthevote.org/about-rock-the-vote/privacy-policy/" @partner_signup_url = "https://docs.google.com/forms/d/e/1FAIpQLSck6XJO2SQeSIenDpuHgNBUop9ENtvsGhMWLFYQDsy-VgO8pg/viewform" @partner_tool_faqs = "https://www.rockthevote.org/programs-and-partner-resources/tech-for-civic-engagement/partner-ovr-tool-faqs/partner-ovr-tool-faqs/" - mail(subject: "Rock the Vote Terms of Use", + mail(subject: "Welcome to Rock the Vote", from: RockyConf.from_address, to: partner.email, date: Time.now.to_s(:db)) diff --git a/app/services/v5/state_requirements.rb b/app/services/v5/state_requirements.rb index e6ef40ffc..b058298f5 100644 --- a/app/services/v5/state_requirements.rb +++ b/app/services/v5/state_requirements.rb @@ -35,6 +35,9 @@ def self.find(query) state = find_state(query) locale = get_locale(state, query[:lang]) + # Instantiate StateCustomization with the state object + state_customization = StateCustomization.new(state) + validate_participation(state, locale) validate_age(state, query[:date_of_birth], locale) @@ -51,6 +54,8 @@ def self.find(query) :sos_address => state.registrar_address, :sos_phone => state.registrar_phone, :sos_url => state.registrar_url, + :online_registration_url => state_customization.online_reg_url(nil), + :online_registration_enabled => state_customization.redirect_to_online_reg_url(nil), :sub_18_msg => locale.sub_18 } end diff --git a/app/validators/mi_registrant_validator.rb b/app/validators/mi_registrant_validator.rb index 409e3dcff..ecdd8807b 100644 --- a/app/validators/mi_registrant_validator.rb +++ b/app/validators/mi_registrant_validator.rb @@ -145,7 +145,7 @@ def validate(reg) def validate_age(reg) return if reg.date_of_birth.blank? - earliest_date = Date.today - 17.years - 6.months + earliest_date = Date.today - 16.years if reg.date_of_birth > earliest_date reg.errors.add(:date_of_birth, :too_young) end diff --git a/app/views/abrs/step_2_abr_deadline_passed_general.html.haml b/app/views/abrs/step_2_abr_deadline_passed_general.html.haml index 5755ca95a..b04af1667 100644 --- a/app/views/abrs/step_2_abr_deadline_passed_general.html.haml +++ b/app/views/abrs/step_2_abr_deadline_passed_general.html.haml @@ -19,7 +19,7 @@ - existing_locale = src_url.match(/(\?|&)locale=([^&]*)/)&.captures&.last || I18n.locale - src_url = src_url.gsub(/(\?|&)locale=[^&]*/, '') # Remove any existing locale parameter - src_url += src_url.include?('?') ? "&locale=#{existing_locale}" : "?locale=#{existing_locale}" # Append the new locale - %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:0; padding:0; width:100%;', src: src_url } + %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:40px 0 0 0; padding:0; width:100%;', src: src_url } :javascript document.addEventListener('DOMContentLoaded', function () { diff --git a/app/views/abrs/step_2_abr_everyone_gets_ballot.html.haml b/app/views/abrs/step_2_abr_everyone_gets_ballot.html.haml index 5de765756..dda9d0087 100644 --- a/app/views/abrs/step_2_abr_everyone_gets_ballot.html.haml +++ b/app/views/abrs/step_2_abr_everyone_gets_ballot.html.haml @@ -1,16 +1,22 @@ +-# STATENAME Automatically mails all registered voters a ballot - abbrev = @abr.i18n_key %h2{role: "heading", "aria-level": 2}= t("states.custom.#{abbrev}.abr.everyone_gets_ballot.header_1", state_name: @abr.home_state_name, default:t("txt.abr.everyone_gets_ballot.header_1", state_name: @abr.home_state_name)).html_safe +-# If you are registered to vote in STATE NAME you do not need to request... .state-instructions = t("states.custom.#{abbrev}.abr.everyone_gets_ballot.instructions_1", state_name: @abr.home_state_name, url: new_catalist_lookup_path(partner: @abr.partner_id, email: @abr.email, zip: @abr.zip), default: t("txt.abr.everyone_gets_ballot.instructions_1", state_name: @abr.home_state_name, url: new_catalist_lookup_path(partner: @abr.partner_id, email: @abr.email, zip: @abr.zip))).html_safe -%h2{role: "heading", "aria-level": 2}= t("txt.abr.everyone_gets_ballot.header_2").html_safe +-# questions and next steps +-#%h2{role: "heading", "aria-level": 2}= t("txt.abr.everyone_gets_ballot.header_2").html_safe -.state-instructions - = t("states.custom.#{abbrev}.abr.everyone_gets_ballot.instructions_2", registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)).html_safe +-# custom from state instructions_2 +-#.state-instructions +-# = t("states.custom.#{abbrev}.abr.everyone_gets_ballot.instructions_2", registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)).html_safe -%h2{role: "heading", "aria-level": 2}= t("txt.abr.everyone_gets_ballot.header_3").html_safe +-# Don't Forget to Vote! +-#%h2{role: "heading", "aria-level": 2}= t("txt.abr.everyone_gets_ballot.header_3").html_safe +-# custom from state instructions 3 (deadlines for delivering your ballot) .state-instructions = t("states.custom.#{abbrev}.abr.everyone_gets_ballot.instructions_3").html_safe @@ -20,7 +26,7 @@ #finish_page_iframe - src_url = @abr_finish_iframe_url - src_url = src_url.split('?')[0] # Remove all existing query parameters - %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:0; padding:0; width:100%;', src: src_url } + %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:40px 0 0 0; padding:0; width:100%;', src: src_url } :javascript document.addEventListener('DOMContentLoaded', function () { diff --git a/app/views/abrs/step_2_abr_splash_page_general.html.haml b/app/views/abrs/step_2_abr_splash_page_general.html.haml index 01fe05480..0563d3e4d 100644 --- a/app/views/abrs/step_2_abr_splash_page_general.html.haml +++ b/app/views/abrs/step_2_abr_splash_page_general.html.haml @@ -1,18 +1,43 @@ - abbrev = @abr.i18n_key + %h2{role: "heading", "aria-level": 2, id: "abr_splash_header_1"}= t("txt.abr.splash.header_1", state_name: @abr.home_state_name).html_safe +-# The following header is coming from: +-# = t("txt.abr.splash.header_1", state_name: @abr.home_state_name) .state-instructions - = t("states.custom.#{abbrev}.abr.splash.instructions_1", state_name: @abr.home_state_name, lookup_url: new_catalist_lookup_path(partner: @abr.partner_id, email: @abr.email, zip: @abr.zip), registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)).html_safe + - instructions_1 = t("txt.abr.splash.instructions_1", state_name: @abr.home_state_name, lookup_url: new_catalist_lookup_path(partner: @abr.partner_id, email: @abr.email, zip: @abr.zip), registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) + = instructions_1.html_safe + +- if @abr.home_state_oabr_url.present? + %a{ href: @abr.home_state_oabr_url, style: "word-wrap: break-word; overflow-wrap: break-word; display: inline-block;" }= @abr.home_state_oabr_url +- else + %p No URL available at this time. -%h2{role: "heading", "aria-level": 2, id: "abr_splash_header_2"}= t("txt.abr.splash.header_2").html_safe + +-# The following instructions are coming from: +-# = t("states.custom.#{abbrev}.abr.splash.instructions_1", state_name: @abr.home_state_name, lookup_url: new_catalist_lookup_path(partner: @abr.partner_id, email: @abr.email, zip: @abr.zip), registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) + +-#%h2{role: "heading", "aria-level": 2, id: "abr_splash_header_2"}= t("txt.abr.splash.header_2").html_safe +-# The following header is coming from: +-# = t("txt.abr.splash.header_2") .state-instructions - = t("states.custom.#{abbrev}.abr.splash.instructions_2", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)).html_safe + - instructions_2 = t("states.custom.#{abbrev}.abr.splash.instructions_2", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) + = instructions_2.html_safe +-# The following instructions are coming from: +-# = t("states.custom.#{abbrev}.abr.splash.instructions_2", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) -%h2{role: "heading", "aria-level": 2, id: "abr_splash_header_3"}= t("txt.abr.splash.header_3").html_safe +-# Don't Forget to Vote! +-#%h2{role: "heading", "aria-level": 2, id: "abr_splash_header_3"}= t("txt.abr.splash.header_3").html_safe +-# The following header is coming from: +-# = t("txt.abr.splash.header_3") .state-instructions - = t("states.custom.#{abbrev}.abr.splash.instructions_3", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)).html_safe + - instructions_3 = t("states.custom.#{abbrev}.abr.splash.instructions_3", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) + = instructions_3.html_safe +-# The following instructions are coming from: +-# = t("states.custom.#{abbrev}.abr.splash.instructions_3", state_name: @abr.home_state_name, registration_url: new_registrant_path(partner: @abr.partner, email_address: @abr.email, home_zip_code: @abr.zip)) + -# #finish_page_iframe -# %iframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:0; padding:0; width:100%;', src: @abr_finish_iframe_url } @@ -22,7 +47,7 @@ - existing_locale = src_url.match(/(\?|&)locale=([^&]*)/)&.captures&.last || I18n.locale - src_url = src_url.gsub(/(\?|&)locale=[^&]*/, '') # Remove any existing locale parameter - src_url += src_url.include?('?') ? "&locale=#{existing_locale}" : "?locale=#{existing_locale}" # Append the new locale - %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:0; padding:0; width:100%;', src: src_url } + %iframe#dynamicLocaleIframe{border: '0', height: "575px", "ALLOWTRANSPARENCY": true, frameborder: "no", style: 'border:none !important; margin:40px 0 0 0; padding:0; width:100%;', src: src_url } :javascript document.addEventListener('DOMContentLoaded', function () { diff --git a/app/views/notifier/chaser.html.erb b/app/views/notifier/chaser.html.erb index 7b6703b6f..4f9e7f5b7 100644 --- a/app/views/notifier/chaser.html.erb +++ b/app/views/notifier/chaser.html.erb @@ -10,6 +10,8 @@ :cancel_reminders_url =>@cancel_reminders_url, :registrar_phone=> @registrar_phone, :registrar_url=>@registrar_url, - :rtv_link=>@rtv_link, :locale => @locale + :rtv_link=>@rtv_link, + :rtv_url=>Nokogiri::HTML(@rtv_link).css('a').first['href'], + :locale => @locale ).html_safe %> diff --git a/app/views/notifier/partner_terms_of_use.html.erb b/app/views/notifier/partner_terms_of_use.html.erb index b26e2dfaa..9b0a4e789 100644 --- a/app/views/notifier/partner_terms_of_use.html.erb +++ b/app/views/notifier/partner_terms_of_use.html.erb @@ -1,16 +1,16 @@Hi <%= @name %>,
-Thank you for signing up for a Rock the Vote civic technology tool! We're so glad to have you join our community of companies, nonprofits, and activists nationwide who use Rock the Vote's platform to register voters. +Thank you for signing up for Rock the Vote's civic technology tools! We're so glad to have you join our community of companies, nonprofits, and activists nationwide who use Rock the Vote's platform to register and mobilize voters.
-Please read Rock the Vote's Terms of Use which outlines important information about our Privacy Policy, restrictions on digital advertising, custom branding, and more. Rock the Vote reserves the right to discontinue access to your tool if there is a breach to our Terms of Use. -
--To learn more about how to use your civic technology tools, please read our Partner FAQs. Thank you for your partnership in this important work! If you have any questions, please don't hesitate to reach out. +Our team will reach out soon with information on how to access your tools and Partner Portal. Thank you for your partnership in this important work!
- Rock the Vote
++Note: Your civic technology partnership agreement contains important information about our Terms of Use. Rock the Vote reserves the right to discontinue access to your tool if there is a breach to the terms of your agreement. +
If you are registered to vote in Cali you do not need to request a + vote-by-mail ballot. Vote-by-mail ballots will be sent to all registered voters + before the upcoming election. You can return the vote-by-mail ballot you receive + by mail, or vote in person at your polling location.
instructions_2: |-Any registered voter may vote using a vote-by-mail ballot instead of going to the polls on Election Day.
To update your name or address, submit a new voter registration.
@@ -416,7 +421,7 @@ en:If you are a Californian living away from home while attending school, you may choose to register to vote using your home away from home address or your traditional home address. You may not register to vote in two places during the same election cycle.
instructions_3: |- -Your + instructions_3: "
Your ballot must be received by the Supervisor of Elections' office no later than 7:00pm on Election Day.
\nIf mailed, the United States Postal Service recommends mailing your ballot at least one (1) week \nbefore @@ -740,7 +745,7 @@ en:
Other voters who are away from their Hawaii residence during the election may submit an Absentee Application to have their ballot mailed to an alternate mailing address for the primary election, general election, or both.
Request an application with the state.
instructions_3: |- -You may return your voted ballot by mail or in person at a designated place of deposit within your county. Voted ballots must be received by your County Elections Division by 7:00 p.m. on Election Day.
@@ -2252,7 +2257,7 @@ en: be received by your local county election official by the appropriate deadline." instructions_3: |- -Your ballot must be delivered by the close of polls on the date of election, or if you mail it, postmarked by Election Day.
@@ -2541,7 +2546,7 @@ en: during an election should fill out an \nabsentee ballot form and \nmail it to their county elections office, \nor update their address online." - instructions_3: "\nYour + instructions_3: "
\nYour ballot can be mailed or dropped off at any official drop box across the state.\n
\n\nBallots must be received at a dropbox or mailed with a valid post mark by 8 p.m. on Election @@ -3390,7 +3395,7 @@ en: title=\"Voters Away at College\">voting as a student.
" instructions_3: |--
Your ballot must either be postmarked no later than Election Day or returned to a ballot drop box by 8 p.m. on Election Day.
@@ -4279,6 +4284,12 @@ en: or passport. A full list of acceptable documentation can be found online. pdf_other_instructions: blank: '' + north_carolina: |- + If you want to register with a party, fill in Section 7 (Choice of Party) on + your form. You must register with a party to vote in that party’s primary + unless that party allows unaffiliated voters to vote in its primary. If you + indicate a political party that is not a qualified party, or indicate no party, + you will be listed as "Unaffiliated." wisconsin: |- Visit https://myvote.wi.gov up to 20 days before the election if the voter has a current and valid Wisconsin driver license or state-issued @@ -4307,6 +4318,12 @@ en:A full list of acceptable documentation can be found on the Secretary of State's website.
+ north_carolina: |- +If you want to register with a party, fill in Section 7 (Choice of Party) on + your form. You must register with a party to vote in that party’s primary + unless that party allows unaffiliated voters to vote in its primary. If you + indicate a political party that is not a qualified party, or indicate no party, + you will be listed as "Unaffiliated."
wisconsin: |- *Note: All voters MUST provide a Proof of Residence Document in Wisconsin.If you are registered to vote in %{state_name} you do not need to request an absentee ballot.
-Make sure you are registered to vote!
+If you are registered to vote in %{state_name} you do not need to request a + vote-by-mail ballot. Vote-by-mail ballots will be sent to all registered voters + before the upcoming election. You can return the vote-by-mail ballot you receive + by mail, or vote in person at your polling location.
header_2: Questions & Next Steps header_3: Don't Forget To Vote! - deadline_passed_header: Requesting an Absentee Ballot in %{state} + deadline_passed_header: Rock the Vote has temporarily turned off the Absentee Request Tool in %{state} deadline_passed_instructions: |- -Thanks for being an active voter! We don't have an upcoming election in our database to request an absentee ballot for. Sign up for our election reminders to receive an email with information about requesting an absentee ballot when there's an election in your area.
-Right now, make sure that you're a registered voter so that you're able to vote by mail in future elections.
+The most common reasons we deactivate our tool include: +
Sign up for election reminders, and we’ll remind you to request an absentee ballot when there’s an election in your area.
deadline_passed_state_instructions: url: you can look up your status by using your state's online tool. diff --git a/db/bootstrap/import/states.yml b/db/bootstrap/import/states.yml index 780ad01be..5a7e06d9f 100644 --- a/db/bootstrap/import/states.yml +++ b/db/bootstrap/import/states.yml @@ -439,7 +439,7 @@ record_22: MI 48901-0726 sos_phone: "(800) 292-5973" sos_url: https://mvic.sos.state.mi.us/Voter/Index - sub_18: 6_months_before + sub_18: once_turned_16 registration_deadline: michigan online_registration_url: https://mvic.sos.state.mi.us/registervoter online_registration_system_name: Michigan Voter Information Center @@ -628,7 +628,7 @@ record_33: name: North Carolina requires_race: true race_tooltip: not_required_with_state_name - requires_party: true + requires_party: false party_tooltip: required_for_primary_unless id_number_tooltip: drivers_license_or_dmv_with_state_name sos_address: State Board of Elections