From 072142811ff88b6d29645de41d8fc8f9f1e3c906 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Mon, 22 Jun 2020 14:14:25 +0200 Subject: [PATCH] Upstream sync --- app/assets/javascripts/photo_preview.js | 3 + .../public/appearance_releases_controller.rb | 17 +++++ app/models/appearance_release.rb | 17 +++++ app/models/concerns/second_guardian_name.rb | 20 ++++++ .../concerns/second_guardian_photoable.rb | 9 +++ app/views/contracts/_photos.html.erb | 11 +++ app/views/contracts/_signature_page.html.erb | 15 +++++ .../public/appearance_releases/new.html.erb | 43 ++++++++++++ config/locales/en.yml | 21 ++++++ config/locales/es.yml | 17 +++++ ..._guardian_fields_to_appearance_releases.rb | 14 ++++ db/structure.sql | 15 ++++- .../user_managing_appearance_releases_spec.rb | 67 +++++++++++++++++++ 13 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 app/models/concerns/second_guardian_name.rb create mode 100644 app/models/concerns/second_guardian_photoable.rb create mode 100644 db/migrate/20200619134853_add_second_guardian_fields_to_appearance_releases.rb diff --git a/app/assets/javascripts/photo_preview.js b/app/assets/javascripts/photo_preview.js index 3f0cbb8..34c4543 100644 --- a/app/assets/javascripts/photo_preview.js +++ b/app/assets/javascripts/photo_preview.js @@ -57,4 +57,7 @@ $(document).on("turbolinks:load", function() { $("[data-behavior=take-guardian-photo]").click(function(e) { $("[data-ujs-target=guardian-photo-input]").trigger("click"); }); + $("[data-behavior=take-guardian-2-photo]").click(function(e) { + $("[data-ujs-target=guardian-2-photo-input]").trigger("click"); + }); }); diff --git a/app/controllers/public/appearance_releases_controller.rb b/app/controllers/public/appearance_releases_controller.rb index 419fcd1..17d5464 100644 --- a/app/controllers/public/appearance_releases_controller.rb +++ b/app/controllers/public/appearance_releases_controller.rb @@ -71,8 +71,25 @@ class Public::AppearanceReleasesController < Public::BaseController ] end + def second_guardian_params + %i[ + guardian_2_first_name + guardian_2_last_name + guardian_2_phone + guardian_2_email + guardian_2_photo + guardian_2_address_street1 + guardian_2_address_street2 + guardian_2_address_city + guardian_2_address_state + guardian_2_address_zip + guardian_2_address_country + ] + end + def appearance_release_params params.require(:appearance_release).permit(person_params, guardian_params, + second_guardian_params, :minor, :signature_base64, :person_date_of_birth, :locale, :contract_template) diff --git a/app/models/appearance_release.rb b/app/models/appearance_release.rb index 078eefd..9a750a7 100644 --- a/app/models/appearance_release.rb +++ b/app/models/appearance_release.rb @@ -12,7 +12,9 @@ class AppearanceRelease < ApplicationRecord include Taggable include PersonName include GuardianPhotoable + include SecondGuardianPhotoable include GuardianName + include SecondGuardianName has_one_attached :person_photo @@ -38,6 +40,17 @@ class AppearanceRelease < ApplicationRecord %w[guardian_address_country country] ] + composed_of :guardian_2_address, + class_name: 'Address', + mapping: [ + %w[guardian_2_address_street1 street1], + %w[guardian_2_address_street2 street2], + %w[guardian_2_address_city city], + %w[guardian_2_address_state state], + %w[guardian_2_address_zip zip], + %w[guardian_2_address_country country] + ] + # These validations apply to all releases validates :person_email, email: true, allow_blank: true @@ -132,6 +145,10 @@ class AppearanceRelease < ApplicationRecord true end + def second_guardian_present? + self.guardian_2_first_name.present? + end + def contract_file_name "#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime('%Y.%m.%d')}_#{release_number}_#{filename_suffix.parameterize}" end diff --git a/app/models/concerns/second_guardian_name.rb b/app/models/concerns/second_guardian_name.rb new file mode 100644 index 0000000..8e4e04d --- /dev/null +++ b/app/models/concerns/second_guardian_name.rb @@ -0,0 +1,20 @@ +module SecondGuardianName + extend ActiveSupport::Concern + + included do + def guardian_2_name + "#{guardian_2_first_name} #{guardian_2_last_name}".titleize + end + + def guardian_2_name=(value) + if value.include?(' ') + split = value.split(" ", 2) + self.guardian_2_first_name = split.first + self.guardian_2_last_name = split.last + else + self.guardian_2_first_name = value + self.guardian_2_last_name = "(Not Given)" + end + end + end +end diff --git a/app/models/concerns/second_guardian_photoable.rb b/app/models/concerns/second_guardian_photoable.rb new file mode 100644 index 0000000..5e21240 --- /dev/null +++ b/app/models/concerns/second_guardian_photoable.rb @@ -0,0 +1,9 @@ +module SecondGuardianPhotoable + extend ActiveSupport::Concern + + included do + has_one_attached :guardian_2_photo + + validates :guardian_2_photo, content_type: ["image/png", "image/jpeg"] + end +end diff --git a/app/views/contracts/_photos.html.erb b/app/views/contracts/_photos.html.erb index 6f429f7..242881c 100644 --- a/app/views/contracts/_photos.html.erb +++ b/app/views/contracts/_photos.html.erb @@ -5,6 +5,9 @@ <% if release.respond_to? :guardian_photo %> <% @total_photos_count += release.guardian_photo.attached? ? 1 : 0 %> <% end %> +<% if release.respond_to? :guardian_2_photo %> + <% @total_photos_count += release.guardian_2_photo.attached? ? 1 : 0 %> +<% end %>

<%= t '.heading', count: @total_photos_count %>

diff --git a/app/views/contracts/_signature_page.html.erb b/app/views/contracts/_signature_page.html.erb index 74dc9dc..25d92ba 100644 --- a/app/views/contracts/_signature_page.html.erb +++ b/app/views/contracts/_signature_page.html.erb @@ -69,4 +69,19 @@ <%= description_list_pair_for releasable, :signed_on, append: ":" %> + <% if releasable.respond_to?(:second_guardian_present?) && releasable.second_guardian_present? %> + +
+

Second guardian Information

+ + <% # Second guardian information %> +
+ <%= description_list_pair_for releasable, :guardian_2_name, append: ":" %> + <%= description_list_pair_for releasable, :guardian_2_address, append: ":" %> + <%= description_list_pair_for releasable, :guardian_2_phone, append: ":" %> + <%= description_list_pair_for releasable, :guardian_2_email, append: ":" %> +
+ + <% end %> + <% end %> diff --git a/app/views/public/appearance_releases/new.html.erb b/app/views/public/appearance_releases/new.html.erb index 99d4c40..f23960f 100644 --- a/app/views/public/appearance_releases/new.html.erb +++ b/app/views/public/appearance_releases/new.html.erb @@ -113,6 +113,49 @@
+ <%= card_field_set_tag t(".guardian_2_info.heading") do %> +
+ <%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %> + <%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %> + <%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %> +
+
+ <%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %> +
+ <%= render "shared/address_fields", form: form, subject: "guardian_2" %> + <% end %> + +
+ + <%= card_field_set_tag t(".guardian_2_photo.heading") do %> +
<%= t ".guardian_2_photo.instructions" %>
+
+
+
+ <%= t ".photo.no_photo" %> +
+
+
+ <% if @appearance_release.guardian_2_photo.attached? %> + <%= javascript_tag nonce: true do %> + App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@appearance_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>"); + <% end %> + <% end %> +
+ <%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if @appearance_release.guardian_2_photo.attached? %> + <%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, accept: @appearance_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %> +
+ <%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-2-photo" } %> +
+

+ <%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %>
+ <%= t ".photo.warning" %> +

+
+ <% end %> + +
+ <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 120294d..bc7cd23 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -60,6 +60,10 @@ en: activerecord: attributes: appearance_release: + guardian_2_address: Second guardian address + guardian_2_email: Second guardian email + guardian_2_name: Second guardian name + guardian_2_phone: Second guardian phone person_address: Address person_email: Email person_name: Name @@ -237,6 +241,7 @@ en: heading: New Release Template contracts: photos: + guardian_2_photo_heading: Second guardian photo guardian_photo_heading: Guardian photo heading: one: Photo @@ -328,6 +333,16 @@ en: person_phone: Phone number person_title: Title appearance_release: + guardian_2_address_city: Second guardian city + guardian_2_address_country: Second guardian country + guardian_2_address_state: Second guardian state + guardian_2_address_street1: Second guardian address + guardian_2_address_street2: Second guardian address (Line 2) + guardian_2_address_zip: Second guardian zip code + guardian_2_email: Second guardian email + guardian_2_first_name: Second guardian first name + guardian_2_last_name: Second guardian last name + guardian_2_phone: Second guardian phone guardian_address_city: Guardian city guardian_address_country: Guardian country guardian_address_state: Guardian state @@ -800,6 +815,12 @@ en: notice: Your release has been signed. Thank you! new: cancel: Cancel + guardian_2_info: + heading: Second Guardian Information + guardian_2_photo: + heading: Second Guardian Photo + instructions: > + Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! guardian_clause: heading: Guardian Clause guardian_info: diff --git a/config/locales/es.yml b/config/locales/es.yml index 82258a2..6ce2858 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -66,6 +66,7 @@ es: heading: Release Info (ES) contracts: photos: + guardian_2_photo_heading: Second guardian photo (ES) guardian_photo_heading: Guardian photo (ES) heading: one: Photo (ES) @@ -115,6 +116,16 @@ es: helpers: label: appearance_release: + guardian_2_address_city: Second guardian city (ES) + guardian_2_address_country: Second guardian country (ES) + guardian_2_address_state: Second guardian state (ES) + guardian_2_address_street1: Second guardian address (ES) + guardian_2_address_street2: Second guardian address (Line 2) (ES) + guardian_2_address_zip: Second guardian zip code (ES) + guardian_2_email: Second guardian email (ES) + guardian_2_first_name: Second guardian first name (ES) + guardian_2_last_name: Second guardian last name (ES) + guardian_2_phone: Second guardian phone (ES) guardian_address_city: Guardian city (ES) guardian_address_country: Guardian country (ES) guardian_address_state: Guardian state (ES) @@ -167,6 +178,12 @@ es: notice: La autorización está firmada. ¡Gracias! new: cancel: Cancelar + guardian_2_info: + heading: Second Guardian Information (ES) + guardian_2_photo: + heading: Second Guardian Photo (ES) + instructions: > + (ES) Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! (ES) guardian_clause: heading: Guardian Clause (ES) guardian_photo: diff --git a/db/migrate/20200619134853_add_second_guardian_fields_to_appearance_releases.rb b/db/migrate/20200619134853_add_second_guardian_fields_to_appearance_releases.rb new file mode 100644 index 0000000..a067b44 --- /dev/null +++ b/db/migrate/20200619134853_add_second_guardian_fields_to_appearance_releases.rb @@ -0,0 +1,14 @@ +class AddSecondGuardianFieldsToAppearanceReleases < ActiveRecord::Migration[6.0] + def change + add_column :appearance_releases, :guardian_2_first_name, :string + add_column :appearance_releases, :guardian_2_last_name, :string + add_column :appearance_releases, :guardian_2_email, :string + add_column :appearance_releases, :guardian_2_phone, :string + add_column :appearance_releases, :guardian_2_address_street1, :string + add_column :appearance_releases, :guardian_2_address_street2, :string + add_column :appearance_releases, :guardian_2_address_city, :string + add_column :appearance_releases, :guardian_2_address_state, :string + add_column :appearance_releases, :guardian_2_address_zip, :string + add_column :appearance_releases, :guardian_2_address_country, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index bc6f2ba..972fe4c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -328,7 +328,17 @@ CREATE TABLE public.appearance_releases ( guardian_address_city character varying, guardian_address_state character varying, guardian_address_zip character varying, - guardian_address_country character varying + guardian_address_country character varying, + guardian_2_first_name character varying, + guardian_2_last_name character varying, + guardian_2_email character varying, + guardian_2_phone character varying, + guardian_2_address_street1 character varying, + guardian_2_address_street2 character varying, + guardian_2_address_city character varying, + guardian_2_address_state character varying, + guardian_2_address_zip character varying, + guardian_2_address_country character varying ); @@ -3666,6 +3676,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20200612121539'), ('20200615131722'), ('20200615133602'), -('20200616124214'); +('20200616124214'), +('20200619134853'); diff --git a/spec/features/user_managing_appearance_releases_spec.rb b/spec/features/user_managing_appearance_releases_spec.rb index 33e1eb3..8eba877 100644 --- a/spec/features/user_managing_appearance_releases_spec.rb +++ b/spec/features/user_managing_appearance_releases_spec.rb @@ -72,6 +72,61 @@ feature 'User managing appearance releases' do expect(page).to have_content(successful_submission_message) end + + scenario 'creating a release for a minor with two guardians', js: true do + allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) + + project = create(:project, members: current_user, account: current_user.primary_account) + contract_template = create(:contract_template, project: project) + + visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template) + + expect(page).to have_photo_button + expect(page).not_to have_content('SECOND GUARDIAN INFORMATION') + expect(page).not_to have_content('SECOND GUARDIAN PHOTO') + + page.check person_is_minor_checkbox + expect(page).to have_content('GUARDIAN INFORMATION') + expect(page).to have_content('GUARDIAN PHOTO') + expect(page).to have_content 'Guardian Email' + + expect(page).to have_content 'SECOND GUARDIAN INFORMATION' + expect(page).to have_content 'SECOND GUARDIAN PHOTO' + expect(page).to have_content 'Second Guardian Email' + expect(page).to have_content 'Second Guardian Phone' + expect(page).to have_content 'Second Guardian Address' + + fill_in guardian_first_name_field, with: 'Guardian' + fill_in guardian_last_name_field, with: 'Name' + fill_in guardian_phone_field, with: '001101' + fill_in person_first_name_field, with: 'Jane' + fill_in person_last_name_field, with: 'Doe' + fill_in_person_address_fields + fill_in person_phone_field, with: '555-555-5555' + fill_in person_email_field, with: 'jane.doe@test.com' + fill_in person_date_of_birth, with: '01/01/1999' + attach_file person_photo_field, file_fixture('person_photo.png'), visible: :all + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64' + + fill_in guardian_email_field, with: 'invalid@email' + click_button submit_release_button + expect(page).to have_content('Guardian email is not an email') + + fill_in guardian_email_field, with: 'valid@email.com' + fill_in_guardian_address_fields + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64' + + fill_in guardian_2_first_name_field, with: 'Second' + fill_in guardian_2_last_name_field, with: 'Guardian' + fill_in guardian_2_phone_field, with: '999' + + click_button submit_release_button + + expect(page).to have_content(successful_submission_message) + expect(AppearanceRelease.last.guardian_2_first_name).to eq 'Second' + end end context 'when signed in' do @@ -454,6 +509,18 @@ feature 'User managing appearance releases' do 'appearance_release_minor' end + def guardian_2_first_name_field + 'Second guardian first name' + end + + def guardian_2_last_name_field + 'Second guardian last name' + end + + def guardian_2_phone_field + 'Second guardian phone' + end + def guardian_first_name_field 'Guardian first name' end