diff --git a/app/assets/javascripts/trix.js b/app/assets/javascripts/trix.js index 6c9e9c7..e34afdd 100644 --- a/app/assets/javascripts/trix.js +++ b/app/assets/javascripts/trix.js @@ -1,4 +1,30 @@ // Do not allow file attachments in rich text content addEventListener("trix-file-accept", function(event) { event.preventDefault(); -}) +}); + +Trix.config.textAttributes.underline = { + style: { "textDecoration": "underline" }, + inheritable: true, + parser: function (element) { + var style = window.getComputedStyle(element); + return style.textDecoration === "underline"; + } +} + +document.addEventListener('trix-initialize', function (e) { + const trix = e.target; + const toolBar = trix.toolbarElement; + + // // Creation of the button + const button = document.createElement("button"); + button.setAttribute("type", "button"); + button.setAttribute("class", "trix-button trix-button--icon trix-button--icon-underline"); + button.setAttribute("data-trix-attribute", "underline"); + button.setAttribute("title", "underline"); + button.setAttribute("tabindex", "-1"); + button.innerText = "U"; + + // Attachment of the button to the toolBar + toolBar.querySelector('.trix-button-group--text-tools').appendChild(button); +}); \ No newline at end of file diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 87ffb26..23289e9 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -461,3 +461,10 @@ a[data-behavior=seekable-timecode] { border-color: transparent; border-bottom: 3px solid #ff0000; } + +//Trix underline style +trix-toolbar { + .trix-button--icon-underline::before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z'/%3E%3C/svg%3E"); + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/contract_pdf.scss b/app/assets/stylesheets/contract_pdf.scss index 8c2571f..9f583cb 100644 --- a/app/assets/stylesheets/contract_pdf.scss +++ b/app/assets/stylesheets/contract_pdf.scss @@ -48,6 +48,10 @@ u { margin-right: -30px; } +.embed-person-photo { + text-align: right; +} + .do-not-copy-warning { padding-right: 15px; } diff --git a/app/controllers/contracts_controller.rb b/app/controllers/contracts_controller.rb index 6f943ec..01b1aee 100644 --- a/app/controllers/contracts_controller.rb +++ b/app/controllers/contracts_controller.rb @@ -3,7 +3,7 @@ class ContractsController < ApplicationController respond_to do |format| format.pdf { send_contract_pdf } - if Rails.env.development? + if Rails.env.development? || Rails.env.test? format.html { render_sample_html } end end diff --git a/app/views/contracts/pdf.html.erb b/app/views/contracts/pdf.html.erb index 92d8e73..c354ed5 100644 --- a/app/views/contracts/pdf.html.erb +++ b/app/views/contracts/pdf.html.erb @@ -4,19 +4,31 @@
<% end %> -<% if preview %> -

PREVIEW ONLY

-<% end %> -<% if contract_template.body.present? %> - <%= contract_template.body %> -
-<% end %> -<% if releasable.minor? && contract_template.guardian_clause.present? %> -

Guardian Clause

- <%= contract_template.guardian_clause %> -<% end %> -<% if releasable.respond_to?(:question_1_answer) %> +
+ <% if preview %> +

PREVIEW ONLY

+ <% end %> + + <% if releasable.model_name == "AppearanceRelease" && releasable.person_photo.attached? %> +
+ <%= image_tag releasable.photos.first.variant(auto_orient: true, resize: "200x200"), id: "top-person-photo" %> +
+
+ <% end %> + + <% if contract_template.body.present? %> + <%= contract_template.body %> +
+ <% end %> + + <% if releasable.minor? && contract_template.guardian_clause.present? %> +

Guardian Clause

+ <%= contract_template.guardian_clause %> + <% end %> +
+ +<% if contract_template.present? && contract_template.has_questionnaire? %>
<%= render "contracts/questionnaire", releasable: releasable, contract_template: contract_template, preview: preview %>
diff --git a/spec/factories/contract_templates.rb b/spec/factories/contract_templates.rb index 64757f8..685b6f2 100644 --- a/spec/factories/contract_templates.rb +++ b/spec/factories/contract_templates.rb @@ -19,6 +19,22 @@ FactoryBot.define do amendment_clause "Amendment Legal Language" end + trait :with_questionnaire_legal_text do + questionnaire_legal_text "Questionnaire Legal Text" + end + + trait :with_one_question do + question_1_text "Is this a question?" + end + + trait :with_exhibits do + exhibit_a_legal_text "Exhibit A legal text" + exhibit_b_legal_text "Exhibit B legal text" + + exhibit_a_question_text "Exhibit A question text" + exhibit_b_question_text "Exhibit B question text" + end + factory :appearance_release_contract_template do release_type "appearance" end diff --git a/spec/features/user_manages_contract_templates_spec.rb b/spec/features/user_manages_contract_templates_spec.rb index 0c9e2c4..305bcfd 100644 --- a/spec/features/user_manages_contract_templates_spec.rb +++ b/spec/features/user_manages_contract_templates_spec.rb @@ -386,6 +386,13 @@ RSpec.feature 'User manages contract templates', type: :feature do expect(ct.signature_legal_text.id).not_to eq ContractTemplate.last.signature_legal_text.id end + scenario 'trix editor has underline button', js: true do + visit new_project_contract_template_path(project) + + select 'Appearance Release', from: 'Release type' + expect(page).to have_selector("button[data-trix-attribute='underline']") + end + context 'When the user is associate' do let(:current_user) { create(:user, :associate) } diff --git a/spec/features/user_managing_appearance_releases_spec.rb b/spec/features/user_managing_appearance_releases_spec.rb index 5f61077..ad73acb 100644 --- a/spec/features/user_managing_appearance_releases_spec.rb +++ b/spec/features/user_managing_appearance_releases_spec.rb @@ -544,7 +544,7 @@ feature 'User managing appearance releases' do expect(pdf_body).to have_content('Guardian Email') end - scenario "viewing the contract PDF when exhibit A is signed" do + scenario "viewing the contract PDF when exhibit A is signed and without questionnaire" do contract_template = create(:appearance_release_contract_template, project: project, exhibit_a_legal_text: "Exhibit A legal text", exhibit_a_question_text: "Exhibit A question text") appearance_release = create(:appearance_release, :amendment_signed, @@ -566,10 +566,122 @@ feature 'User managing appearance releases' do expect(pdf_body).to have_content("John Doe") - expect(pdf_body).to have_content "Exhibit A" + expect(pdf_body).to have_content exhibit_a_heading expect(pdf_body).to have_content "Exhibit A legal text" expect(pdf_body).to have_content "Exhibit A question text" expect(pdf_body).to have_content "Answer to exhibit A question" + + expect(pdf_body).not_to have_content questionnaire_heading + expect(pdf_body).not_to have_content exhibit_b_heading + end + + scenario "viewing the contract PDF when exhibit B is signed and without questionnaire" do + contract_template = create(:appearance_release_contract_template, project: project, exhibit_b_legal_text: "Exhibit B legal text", exhibit_b_question_text: "Exhibit B question text") + appearance_release = create(:appearance_release, + :amendment_signed, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + exhibit_b_answer: "Answer to exhibit B question" + ) + + sign_in(current_user) + visit project_appearance_releases_path(project) + click_link *view_release_pdf_link_for(appearance_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content("John Doe") + + expect(pdf_body).to have_content exhibit_b_heading + expect(pdf_body).to have_content "Exhibit B legal text" + expect(pdf_body).to have_content "Exhibit B question text" + expect(pdf_body).to have_content "Answer to exhibit B question" + + expect(pdf_body).not_to have_content questionnaire_heading + expect(pdf_body).not_to have_content exhibit_a_heading + end + + scenario "viewing the contract PDF with questionnaire and without exhibits" do + contract_template = create(:appearance_release_contract_template, :with_questionnaire_legal_text, :with_one_question, project: project) + appearance_release = create(:appearance_release, + :amendment_signed, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + question_1_answer: "Yes" + ) + + sign_in(current_user) + visit project_appearance_releases_path(project) + click_link *view_release_pdf_link_for(appearance_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content questionnaire_heading + expect(pdf_body).to have_content contract_template.question_1_text + expect(pdf_body).to have_content appearance_release.question_1_answer + + expect(pdf_body).not_to have_content exhibit_a_heading + expect(pdf_body).not_to have_content exhibit_b_heading + end + + scenario "viewing the contract PDF with questionnaire and with exhibits" do + contract_template = create(:appearance_release_contract_template, + :with_questionnaire_legal_text, + :with_one_question, + :with_exhibits, + project: project) + appearance_release = create(:appearance_release, + :amendment_signed, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + question_1_answer: "Yes", + exhibit_a_answer: "Exhibit A answer", + exhibit_b_answer: "Exhibit B answer" + ) + + sign_in(current_user) + visit project_appearance_releases_path(project) + click_link *view_release_pdf_link_for(appearance_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content questionnaire_heading + expect(pdf_body).to have_content contract_template.question_1_text + expect(pdf_body).to have_content appearance_release.question_1_answer + + expect(pdf_body).to have_content exhibit_a_heading + expect(pdf_body).to have_content contract_template.exhibit_a_legal_text.to_plain_text + expect(pdf_body).to have_content contract_template.exhibit_a_question_text + expect(pdf_body).to have_content appearance_release.exhibit_a_answer + + expect(pdf_body).to have_content exhibit_b_heading + expect(pdf_body).to have_content contract_template.exhibit_b_legal_text.to_plain_text + expect(pdf_body).to have_content contract_template.exhibit_b_question_text + expect(pdf_body).to have_content appearance_release.exhibit_b_answer + end + + scenario "viewing the contract PDF - it shows person photo on first page if person photo is attached" do + appearance_release = create(:appearance_release_with_contract_template, :native, :minor_with_guardian_photo, project: project) + + visit view_release_pdf_html_preview_link_for(appearance_release) + + person_photo_url = url_for(appearance_release.person_photo.variant(auto_orient: true, resize: "200x200")).to_s + expect(page).to have_selector("#top-person-photo[src^='#{person_photo_url}']") end scenario 'deleting a release', js: true do @@ -908,6 +1020,10 @@ feature 'User managing appearance releases' do ['Download', href: appearance_release_contracts_path(appearance_release, format: 'pdf')] end + def view_release_pdf_html_preview_link_for(appearance_release) + appearance_release_contracts_path(appearance_release) + end + def successful_submission_message 'Your release was successfully submitted. Thank you.' end @@ -987,4 +1103,16 @@ feature 'User managing appearance releases' do def amendment_signature_label t 'contracts.amendment_page.description_labels.amendment_signature' end + + def questionnaire_heading + t 'contracts.questionnaire.heading.appearance_release' + end + + def exhibit_a_heading + t 'contracts.exhibit_a_page.heading.appearance_release' + end + + def exhibit_b_heading + t 'contracts.exhibit_b_page.heading.appearance_release' + end end diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb index 7c43ddc..2af278b 100644 --- a/spec/features/user_managing_medical_releases_spec.rb +++ b/spec/features/user_managing_medical_releases_spec.rb @@ -244,11 +244,32 @@ feature "User managing medical releases" do expect(pdf_filename).to include("doe-john") expect(pdf_body).to have_content("John Doe") - expect(pdf_body).to have_content "MEDICAL QUESTIONNAIRE" + expect(pdf_body).to have_content questionnaire_heading.upcase expect(pdf_body).to have_content "Question 1 text" expect(pdf_body).to have_content "Question 1 answer" expect(pdf_body).to have_content "Questionnaire legal text" end + + scenario 'viewing contract PDF without medical questionnaire' do + contract_template = create(:medical_release_contract_template, project: project) + medical_release = create(:medical_release, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + ) + + sign_in(current_user) + visit project_medical_releases_path(project) + click_link *view_release_pdf_link_for(medical_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).not_to have_content questionnaire_heading.upcase + end end context "when the user is manager(project manager)" do @@ -499,4 +520,8 @@ feature "User managing medical releases" do def dummy_signature_legal_text 'Some signature legal language' end + + def questionnaire_heading + t 'contracts.questionnaire.heading.medical_release' + end end diff --git a/spec/features/user_managing_misc_releases_spec.rb b/spec/features/user_managing_misc_releases_spec.rb index 81beb63..49b8a5e 100644 --- a/spec/features/user_managing_misc_releases_spec.rb +++ b/spec/features/user_managing_misc_releases_spec.rb @@ -80,7 +80,7 @@ feature "User managing misc releases" do end - scenario 'viewing the contract PDF' do + scenario 'viewing the contract PDF with questionnaire' do misc_release = create(:misc_release, :native, contract_template: build(:misc_release_contract_template, question_1_text: 'Q1'), @@ -121,10 +121,30 @@ feature "User managing misc releases" do expect(pdf_body).to have_content('Woman') expect(pdf_body).to have_content('Brunette') expect(pdf_body).not_to have_content('Guardian Email') - expect(pdf_body).to have_content('QUESTIONNAIRE') + expect(pdf_body).to have_content questionnaire_heading.upcase expect(pdf_body).to have_content('Q1') expect(pdf_body).to have_content('A1') end + + scenario 'viewing the contract PDF without questionnaire' do + misc_release = create(:misc_release, + :native, + contract_template: build(:misc_release_contract_template), + project: project, + person_first_name: 'Jane', + person_last_name: 'Doe' + ) + + sign_in(current_user) + visit project_misc_releases_path(project) + click_link *view_release_pdf_link_for(misc_release) + + expect(content_type).to eq('application/pdf') + expect(content_disposition).to include('inline') + expect(pdf_filename).to include('doe-jane') + + expect(pdf_body).not_to have_content questionnaire_heading.upcase + end end context "when the user is manager(project manager)" do @@ -215,4 +235,8 @@ feature "User managing misc releases" do def view_release_pdf_link_for(release) ['Download', href: misc_release_contracts_path(release, format: 'pdf')] end + + def questionnaire_heading + t 'contracts.questionnaire.heading.misc_release' + end end