From b2536997b352ce9cbd9e30e0c2358f3bc756203d Mon Sep 17 00:00:00 2001 From: Kenny Luong Date: Wed, 26 Jun 2024 14:41:54 -0700 Subject: [PATCH 1/2] Updates case contact form to use dropdown selector --- Gemfile.lock | 2 +- .../case_contacts/form_controller.rb | 2 +- app/decorators/casa_case_decorator.rb | 6 +++++ .../form/_contact_types.html.erb | 16 ++++++----- .../form/_relevant_cases.html.erb | 10 +++++++ app/views/case_contacts/form/details.html.erb | 15 ++--------- config/environments/test.rb | 2 -- spec/support/fill_in_case_contact_fields.rb | 27 ++++++++++++++++--- spec/system/case_contacts/new_spec.rb | 18 +++++++------ 9 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 app/views/case_contacts/form/_relevant_cases.html.erb diff --git a/Gemfile.lock b/Gemfile.lock index 24f02d388f..08786e64aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -642,4 +642,4 @@ RUBY VERSION ruby 3.2.2p53 BUNDLED WITH - 2.5.11 + 2.5.14 diff --git a/app/controllers/case_contacts/form_controller.rb b/app/controllers/case_contacts/form_controller.rb index f2c00310be..2708f36ab2 100644 --- a/app/controllers/case_contacts/form_controller.rb +++ b/app/controllers/case_contacts/form_controller.rb @@ -60,7 +60,7 @@ def get_cases_and_contact_types @contact_types = current_organization.contact_types end @contact_types.order(name: :asc) - + @selected_cases = @case_contact.draft_case_ids @selected_contact_type_ids = @case_contact.contact_type_ids end diff --git a/app/decorators/casa_case_decorator.rb b/app/decorators/casa_case_decorator.rb index 9fd8c820b8..b110818d92 100644 --- a/app/decorators/casa_case_decorator.rb +++ b/app/decorators/casa_case_decorator.rb @@ -114,4 +114,10 @@ def emancipation_checklist_count def show_contact_type?(contact_type_id) object.casa_case_contact_types.map(&:contact_type_id).include?(contact_type_id) end + + def hash_for_multi_select + volunteers = object.volunteers.map(&:display_name).join(", ") + + {value: object.id, text: object.case_number, group: object.casa_org_id, subtext: volunteers} + end end diff --git a/app/views/case_contacts/form/_contact_types.html.erb b/app/views/case_contacts/form/_contact_types.html.erb index efc6c0bb9b..1f91e5f1d1 100644 --- a/app/views/case_contacts/form/_contact_types.html.erb +++ b/app/views/case_contacts/form/_contact_types.html.erb @@ -1,8 +1,10 @@

Choose from the available options below by searching or selecting from the dropdown menu.

-<%= render(Form::MultipleSelectComponent.new( - form: form, - name: :contact_type_ids, - options: options.decorate.map { |ct| ct.hash_for_multi_select_with_cases(casa_cases&.pluck(:id)) }, - selected_items: selected_items, - render_option_subtext: true -)) %> +
+ <%= render(Form::MultipleSelectComponent.new( + form: form, + name: :contact_type_ids, + options: options.decorate.map { |ct| ct.hash_for_multi_select_with_cases(casa_cases&.pluck(:id)) }, + selected_items: selected_items, + render_option_subtext: true + )) %> +
diff --git a/app/views/case_contacts/form/_relevant_cases.html.erb b/app/views/case_contacts/form/_relevant_cases.html.erb new file mode 100644 index 0000000000..7796fab2f3 --- /dev/null +++ b/app/views/case_contacts/form/_relevant_cases.html.erb @@ -0,0 +1,10 @@ +

Select the relevant cases below by searching or selecting from the dropdown menu.

+
+ <%= render(Form::MultipleSelectComponent.new( + form: form, + name: :draft_case_ids, + options: options.decorate.map { |casa_case| casa_case.hash_for_multi_select }, + selected_items: selected_items, + render_option_subtext: current_user.supervisor? + )) %> +
diff --git a/app/views/case_contacts/form/details.html.erb b/app/views/case_contacts/form/details.html.erb index afe2624dbb..92c105f11d 100644 --- a/app/views/case_contacts/form/details.html.erb +++ b/app/views/case_contacts/form/details.html.erb @@ -6,20 +6,9 @@

-
+
<%= form.hidden_field :draft_case_ids, multiple: true, value: nil %> - <% @casa_cases.each do |casa_case| %> -
- <%= check_box_tag "case_contact[draft_case_ids][]", - casa_case.id, - @case_contact.draft_case_ids.include?(casa_case.id), - id: "case_contact_draft_case_id_#{casa_case.id}", - class: ["form-check-input", "casa-case-id", "case-contacts-form-checkbox"] %> - -
- <% end %> + <%= render "relevant_cases", form: form, options: @casa_cases, selected_items: @selected_cases, casa_cases: @casa_cases %>
diff --git a/config/environments/test.rb b/config/environments/test.rb index 8e3f05a654..3926d37a61 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -7,9 +7,7 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - config.action_mailer.default_url_options = {host: "localhost", port: 3000} # for devise authentication - # While tests run files are not watched, reloading is not necessary. config.enable_reloading = false # Turn false under Spring and add config.action_view.cache_template_loading = true. diff --git a/spec/support/fill_in_case_contact_fields.rb b/spec/support/fill_in_case_contact_fields.rb index 35a266621f..67e6093f19 100644 --- a/spec/support/fill_in_case_contact_fields.rb +++ b/spec/support/fill_in_case_contact_fields.rb @@ -7,15 +7,30 @@ module FillInCaseContactFields # @param hours [Integer] # @param minutes [Integer] def complete_details_page(contact_made:, medium: nil, occurred_on: nil, hours: nil, minutes: nil, case_numbers: [], contact_types: [], contact_topics: []) + within find("#draft-case-id-selector") do + find(".ts-control").click + end + case_numbers.each do |case_number| - check case_number + checkbox_for_case_number = find("span", text: case_number).sibling("input") + checkbox_for_case_number.click unless checkbox_for_case_number.checked? + end + + within find("#draft-case-id-selector") do + find(".ts-control").click + end + + within find("#contact-type-id-selector") do + find(".ts-control").click end - find(".ts-control").click contact_types.each do |contact_type| find("span", text: contact_type).click end - find(".ts-control").click + + within find("#contact-type-id-selector") do + find(".ts-control").click + end within "#enter-contact-details" do choose contact_made ? "Yes" : "No" @@ -32,6 +47,12 @@ def complete_details_page(contact_made:, medium: nil, occurred_on: nil, hours: n click_on "Save and Continue" end + def choose_medium(medium, click_continue: true) + choose medium if medium + + click_on "Save and Continue" if click_continue + end + # @param notes [String] def complete_notes_page(notes: "", click_continue: true) fill_in "Additional notes", with: notes diff --git a/spec/system/case_contacts/new_spec.rb b/spec/system/case_contacts/new_spec.rb index bf9dab7cef..b6c6e5400d 100644 --- a/spec/system/case_contacts/new_spec.rb +++ b/spec/system/case_contacts/new_spec.rb @@ -129,11 +129,10 @@ create_contact_types(volunteer_casa_case_one.casa_org) visit new_case_contact_path - complete_details_page(case_numbers: [volunteer_casa_case_one.case_number], contact_types: %w[School], contact_made: true, medium: nil, occurred_on: "04/04/2020", hours: 1, minutes: 45) expect(page).to have_text("Medium type can't be blank") - complete_details_page(case_numbers: [volunteer_casa_case_one.case_number], contact_types: %w[School], contact_made: true, medium: "In Person", occurred_on: "04/04/2020", hours: 1, minutes: 45) + choose_medium("In Person") complete_notes_page fill_in_expenses_page(want_reimbursement: true) click_on "Submit" @@ -168,7 +167,10 @@ visit new_case_contact_path - find(".ts-control").click + within find("#contact-type-id-selector") do + find(".ts-control").click + end + expect(page).not_to have_text("Attorney") expect(page).to have_text("School") expect(page).to have_text("Therapist") @@ -228,8 +230,8 @@ it "selects no cases" do visit new_case_contact_path - expect(page).not_to have_checked_field(first_case.case_number) - expect(page).not_to have_checked_field(second_case.case_number) + expect(page).not_to have_text(first_case.case_number) + expect(page).not_to have_text(second_case.case_number) end it "warns user about using the back button on step 1" do @@ -243,8 +245,8 @@ it "select the cases defined in the params" do visit new_case_contact_path(case_contact: {casa_case_id: first_case.id}) - expect(page).to have_checked_field(first_case.case_number) - expect(page).not_to have_checked_field(second_case.case_number) + expect(page).to have_text(first_case.case_number) + expect(page).not_to have_text(second_case.case_number) end it "does not warn user when clicking the back button" do @@ -264,7 +266,7 @@ it "selects the only case" do visit new_case_contact_path - expect(page).to have_checked_field(first_case.case_number) + expect(page).to have_text(first_case.case_number) end it "does not warn user when clicking the back button" do From 82aecad26bacfbad56cb496312245c0309cfce4b Mon Sep 17 00:00:00 2001 From: Kenny Luong Date: Thu, 27 Jun 2024 10:20:23 -0700 Subject: [PATCH 2/2] Adds safety operator --- app/decorators/casa_case_decorator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/decorators/casa_case_decorator.rb b/app/decorators/casa_case_decorator.rb index b110818d92..d31487163c 100644 --- a/app/decorators/casa_case_decorator.rb +++ b/app/decorators/casa_case_decorator.rb @@ -118,6 +118,6 @@ def show_contact_type?(contact_type_id) def hash_for_multi_select volunteers = object.volunteers.map(&:display_name).join(", ") - {value: object.id, text: object.case_number, group: object.casa_org_id, subtext: volunteers} + {value: object.id, text: object.case_number, group: object&.casa_org_id, subtext: volunteers} end end