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"
|