From 57ab71c86ee5801897b977b4752d8d7a69d0eca5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:04:13 +0000 Subject: [PATCH 01/12] Initial plan From c61809b92cce9407a11421384d0b3e0d00448123 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:06:21 +0000 Subject: [PATCH 02/12] Add email to person profile button and organization dropdown Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com> --- app/controllers/organizations_controller.rb | 4 ++-- app/views/people/index.html.erb | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index cff3b1b28..4b9dc6a20 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -97,8 +97,8 @@ def set_form_variables @current_sector_ids = @organization.sectorable_items.map(&:sector_id) @people_array = Person.joins(:user) .order(:first_name, :last_name) - .pluck(:first_name, :last_name, :id) - .map { |fn, ln, id| [ "#{fn} #{ln}", id ] } + .pluck(:first_name, :last_name, :id, Arel.sql("COALESCE(users.email, people.email, people.email_2)")) + .map { |fn, ln, id, email| [ "#{fn} #{ln}#{" (#{email})" if email.present?}", id ] } if @organization.persisted? && @organization.errors.empty? org_people = @organization.organization_people diff --git a/app/views/people/index.html.erb b/app/views/people/index.html.erb index a93e9deb0..dc38f1dc4 100644 --- a/app/views/people/index.html.erb +++ b/app/views/people/index.html.erb @@ -33,7 +33,8 @@ <% cache [person, current_user.super_user?] do %> - <%= person_profile_button(person) %> + <% email = person.user&.email.presence || person.email.presence || person.email_2.presence %> + <%= person_profile_button(person, subtitle: email) %> <%= person.member_since&.year %> From a368425df7bafd3588fae3d3cce71f7c39f81bba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:08:08 +0000 Subject: [PATCH 03/12] Fix: Use left_joins instead of joins to include all people Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com> --- app/controllers/organizations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 4b9dc6a20..f1d196b40 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -95,7 +95,7 @@ def set_form_variables @organization_statuses = OrganizationStatus.all @sectors_collection = Sector.published.order(:name).pluck(:name, :id) @current_sector_ids = @organization.sectorable_items.map(&:sector_id) - @people_array = Person.joins(:user) + @people_array = Person.left_joins(:user) .order(:first_name, :last_name) .pluck(:first_name, :last_name, :id, Arel.sql("COALESCE(users.email, people.email, people.email_2)")) .map { |fn, ln, id, email| [ "#{fn} #{ln}#{" (#{email})" if email.present?}", id ] } From efb12b1f14925a5978315b9d4572acb66f1dcd0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:09:04 +0000 Subject: [PATCH 04/12] Extract email logic to Person#preferred_email method Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com> --- app/controllers/organizations_controller.rb | 2 ++ app/models/person.rb | 4 ++++ app/views/people/index.html.erb | 3 +-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index f1d196b40..5688a8efe 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -95,6 +95,8 @@ def set_form_variables @organization_statuses = OrganizationStatus.all @sectors_collection = Sector.published.order(:name).pluck(:name, :id) @current_sector_ids = @organization.sectorable_items.map(&:sector_id) + # Build array of [display_name, id] for person selection dropdown + # Email priority matches Person#preferred_email: user.email > person.email > person.email_2 @people_array = Person.left_joins(:user) .order(:first_name, :last_name) .pluck(:first_name, :last_name, :id, Arel.sql("COALESCE(users.email, people.email, people.email_2)")) diff --git a/app/models/person.rb b/app/models/person.rb index 1b8a1f2d5..49cae8801 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -151,6 +151,10 @@ def primary_organization .first&.organization end + def preferred_email + user&.email.presence || email.presence || email_2.presence + end + private def strip_whitespace diff --git a/app/views/people/index.html.erb b/app/views/people/index.html.erb index dc38f1dc4..246694418 100644 --- a/app/views/people/index.html.erb +++ b/app/views/people/index.html.erb @@ -33,8 +33,7 @@ <% cache [person, current_user.super_user?] do %> - <% email = person.user&.email.presence || person.email.presence || person.email_2.presence %> - <%= person_profile_button(person, subtitle: email) %> + <%= person_profile_button(person, subtitle: person.preferred_email) %> <%= person.member_since&.year %> From cfbc1e8c791c36e502a2f5b59ff498dfb2bc2970 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:10:22 +0000 Subject: [PATCH 05/12] Refactor to use Person#preferred_email in controller Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com> --- app/controllers/organizations_controller.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 5688a8efe..eaf17a117 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -96,11 +96,13 @@ def set_form_variables @sectors_collection = Sector.published.order(:name).pluck(:name, :id) @current_sector_ids = @organization.sectorable_items.map(&:sector_id) # Build array of [display_name, id] for person selection dropdown - # Email priority matches Person#preferred_email: user.email > person.email > person.email_2 - @people_array = Person.left_joins(:user) + # Uses Person#preferred_email for consistent email priority + @people_array = Person.includes(:user) .order(:first_name, :last_name) - .pluck(:first_name, :last_name, :id, Arel.sql("COALESCE(users.email, people.email, people.email_2)")) - .map { |fn, ln, id, email| [ "#{fn} #{ln}#{" (#{email})" if email.present?}", id ] } + .map { |person| + email = person.preferred_email + [ "#{person.first_name} #{person.last_name}#{" (#{email})" if email.present?}", person.id ] + } if @organization.persisted? && @organization.errors.empty? org_people = @organization.organization_people From 348e6d701b157f15d167e5f627ab68236fdcb113 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:10:52 +0000 Subject: [PATCH 06/12] Optimize dropdown query performance with pluck Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com> --- app/controllers/organizations_controller.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index eaf17a117..5a11c4dba 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -96,12 +96,17 @@ def set_form_variables @sectors_collection = Sector.published.order(:name).pluck(:name, :id) @current_sector_ids = @organization.sectorable_items.map(&:sector_id) # Build array of [display_name, id] for person selection dropdown - # Uses Person#preferred_email for consistent email priority - @people_array = Person.includes(:user) + # Email priority matches Person#preferred_email: user.email > person.email > person.email_2 + @people_array = Person.left_joins(:user) .order(:first_name, :last_name) - .map { |person| - email = person.preferred_email - [ "#{person.first_name} #{person.last_name}#{" (#{email})" if email.present?}", person.id ] + .pluck( + :first_name, + :last_name, + :id, + Arel.sql("COALESCE(users.email, people.email, people.email_2)") + ) + .map { |fn, ln, id, email| + ["#{fn} #{ln}#{" (#{email})" if email.present?}", id] } if @organization.persisted? && @organization.errors.empty? From cb8bb45cf3101240059da88c400052c2dce8ca5a Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:28:28 -0500 Subject: [PATCH 07/12] claude --- .claude/settings.local.json | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 0b6b7eae5..9e7d03037 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,40 +1,25 @@ { "permissions": { "allow": [ - "Bash(bundle exec brakeman:*)", - "Bash(bundle exec rails routes:*)", - "Bash(bundle exec rails runner:*)", "Bash(bundle exec rspec:*)", - "Bash(bundle exec rubocop:*)", + "Bash(bundle exec rails runner:*)", "Bash(RAILS_ENV=test bundle exec rails runner:*)", "Bash(RAILS_ENV=test bundle exec rspec:*)", + "Bash(git stash:*)", "Bash(git add:*)", - "Bash(git apply:*)", - "Bash(git checkout:*)", "Bash(git commit:*)", - "Bash(git diff:*)", - "Bash(git pull:*)", "Bash(git push:*)", - "Bash(git reset:*)", - "Bash(git stash:*)", + "Bash(git diff:*)", "Bash(bin/rails db:migrate:*)", + "Bash(for i in 1 2 3)", + "Bash(do bundle exec rspec spec/system/stories_spec.rb:71 --format progress)", + "Bash(done)", "Bash(bin/rails runner:*)", - "Bash(chmod:*)", - "Bash(mysql -u root:*)", "Bash(git -C /Users/maebeale/programming/awbw branch --show-current)", "Bash(bundle exec rails routes:*)", "Bash(bundle exec rubocop:*)", "Bash(git -C /Users/maebeale/programming/awbw diff --name-only main...HEAD)", - "Bash(git log:*)", - - "Bash(git fetch:*)", - "Bash(git rebase:*)", - "Bash(grep:*)" - - "Bash(bin/rails generate:*)", - "Bash(bin/rails db:schema:dump:*)", - "Bash(RAILS_ENV=test bin/rails:*)" - + "Bash(git merge:*)" ] } } From c12d572d79fd1f61d5b3905759c213502faefe66 Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:28:37 -0500 Subject: [PATCH 08/12] Change back to authorized scope --- app/controllers/organizations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index dcfd8a737..031b7f478 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -97,7 +97,7 @@ def set_form_variables @current_sector_ids = @organization.sectorable_items.map(&:sector_id) # Build array of [display_name, id] for person selection dropdown # Email priority matches Person#preferred_email: user.email > person.email > person.email_2 - @people_array = Person.left_joins(:user) + @people_array = authorized_scope(Person.joins(:user)) .order(:first_name, :last_name) .pluck( :first_name, From d51342931c3ad2aa726e5f615930985e1e383d27 Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:31:16 -0500 Subject: [PATCH 09/12] Include all people, even those without users --- app/controllers/organizations_controller.rb | 2 +- app/views/stories/_form.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 031b7f478..2b45acf9b 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -97,7 +97,7 @@ def set_form_variables @current_sector_ids = @organization.sectorable_items.map(&:sector_id) # Build array of [display_name, id] for person selection dropdown # Email priority matches Person#preferred_email: user.email > person.email > person.email_2 - @people_array = authorized_scope(Person.joins(:user)) + @people_array = authorized_scope(Person.left_joins(:user)) .order(:first_name, :last_name) .pluck( :first_name, diff --git a/app/views/stories/_form.html.erb b/app/views/stories/_form.html.erb index c987f09c0..fbb6424d5 100644 --- a/app/views/stories/_form.html.erb +++ b/app/views/stories/_form.html.erb @@ -104,7 +104,7 @@
<%= f.input :spotlighted_facilitator_id, - collection: Person.joins(:user).order("users.first_name, users.last_name"), + collection: Person.left_joins(:user).order("users.first_name, users.last_name"), label_method: :full_name, value_method: :id, include_blank: true, From 4a15eb2e04fdd6b47b74491b7926ebde0efeef00 Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:37:30 -0500 Subject: [PATCH 10/12] Fix rubocop --- app/controllers/organizations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 2b45acf9b..4c2b8a6ae 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -106,7 +106,7 @@ def set_form_variables Arel.sql("COALESCE(users.email, people.email, people.email_2)") ) .map { |fn, ln, id, email| - ["#{fn} #{ln}#{" (#{email})" if email.present?}", id] + [ "#{fn} #{ln}#{" (#{email})" if email.present?}", id ] } if @organization.persisted? && @organization.errors.empty? From 1dc81337b40ada11cda0169bf9a4f0ca55c10cd1 Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:59:22 -0500 Subject: [PATCH 11/12] Make workshop_variation_idea name a sequence to fix failing test --- spec/factories/workshop_variation_ideas.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/factories/workshop_variation_ideas.rb b/spec/factories/workshop_variation_ideas.rb index 97ead026d..13026d69c 100644 --- a/spec/factories/workshop_variation_ideas.rb +++ b/spec/factories/workshop_variation_ideas.rb @@ -1,6 +1,6 @@ FactoryBot.define do factory :workshop_variation_idea do - name { "Workshop Variation Idea" } + sequence(:name) { |n| "Workshop Variation Idea #{n}" } body { "This is a variation idea description" } youtube_url { "https://www.youtube.com/watch?v=example" } permission_given { true } From 0ea9070cd965a501636ad274accd72e09472550d Mon Sep 17 00:00:00 2001 From: maebeale Date: Mon, 16 Feb 2026 17:59:35 -0500 Subject: [PATCH 12/12] Add wait to fix flaky test --- spec/system/reset_password_person_spec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/system/reset_password_person_spec.rb b/spec/system/reset_password_person_spec.rb index 89473bec2..97e6db5c5 100644 --- a/spec/system/reset_password_person_spec.rb +++ b/spec/system/reset_password_person_spec.rb @@ -9,6 +9,8 @@ sign_in person_user # Start on a page where the user nav is visible visit root_path + # Wait for any flash message overlay to disappear before clicking avatar + page.has_no_css?('#flash_now', visible: true, wait: 10) # Open user nav dropdown (wait for avatar to appear after page load) find('#avatar button', wait: 10).click # Click "Change password"