From 9bd59cc62c866efcc05b125fbbecbcb2b0b065f4 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Wed, 7 Jan 2026 05:26:16 -0800 Subject: [PATCH] feat: display user names in proactive outreach history MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Show actual user names instead of raw Slack user IDs in the admin outreach history table. Joins member_outreach with slack_user_mappings to fetch display_name/real_name, falling back to slack_user_id if no name is available. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .changeset/activity-user-names.md | 4 ++++ server/public/admin-outreach.html | 8 +++++--- server/src/db/insights-db.ts | 15 ++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 .changeset/activity-user-names.md diff --git a/.changeset/activity-user-names.md b/.changeset/activity-user-names.md new file mode 100644 index 000000000..3b1026e46 --- /dev/null +++ b/.changeset/activity-user-names.md @@ -0,0 +1,4 @@ +--- +--- + +Display user names instead of Slack IDs in proactive outreach history diff --git a/server/public/admin-outreach.html b/server/public/admin-outreach.html index b0ee31d8b..ffe78b0f0 100644 --- a/server/public/admin-outreach.html +++ b/server/public/admin-outreach.html @@ -663,10 +663,12 @@

New Variant

function renderHistory() { const tbody = document.getElementById('history-body'); - tbody.innerHTML = history.map(item => ` + tbody.innerHTML = history.map(item => { + const userName = item.slack_display_name || item.slack_real_name || item.slack_user_id; + return ` ${formatDate(item.sent_at)} - ${escapeHtml(item.slack_user_id)} + ${escapeHtml(userName)} ${item.outreach_type} ${item.tone ? `${item.tone} / ${item.approach}` : '—'} @@ -680,7 +682,7 @@

New Variant

- `).join(''); + `}).join(''); } async function loadVariants() { diff --git a/server/src/db/insights-db.ts b/server/src/db/insights-db.ts index 91d75f395..6762f52cb 100644 --- a/server/src/db/insights-db.ts +++ b/server/src/db/insights-db.ts @@ -117,6 +117,11 @@ export interface ResponseAnalysis { analysisNote: string; } +export interface MemberOutreachWithUser extends MemberOutreach { + slack_display_name: string | null; + slack_real_name: string | null; +} + // Input types export interface CreateInsightTypeInput { name: string; @@ -1295,9 +1300,13 @@ export class InsightsDatabase { /** * Get recent outreach history for admin dashboard */ - async getRecentOutreach(limit = 50): Promise { - const result = await query( - 'SELECT * FROM member_outreach ORDER BY sent_at DESC LIMIT $1', + async getRecentOutreach(limit = 50): Promise { + const result = await query( + `SELECT mo.*, sm.slack_display_name, sm.slack_real_name + FROM member_outreach mo + LEFT JOIN slack_user_mappings sm ON sm.slack_user_id = mo.slack_user_id + ORDER BY mo.sent_at DESC + LIMIT $1`, [limit] ); return result.rows;