Skip to content

Commit 7ad5c99

Browse files
committed
add the same tooltip behavior also to the avatars in the topics list
Signed-off-by: Kai Wagner <kai.wagner@percona.com>
1 parent c59b579 commit 7ad5c99

File tree

4 files changed

+74
-11
lines changed

4 files changed

+74
-11
lines changed

app/models/topic.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,61 @@ def participant_aliases(limit: 10)
4949
participants
5050
end
5151

52+
def participant_alias_stats(limit: 10)
53+
stats = messages.group(:sender_id)
54+
.select('sender_id, COUNT(*) as message_count, MAX(messages.created_at) AS last_at')
55+
.order('message_count DESC')
56+
.limit(50)
57+
.index_by(&:sender_id)
58+
59+
first_sender = messages.order(:created_at).first&.sender
60+
last_sender = messages.order(:created_at).last&.sender
61+
62+
missing_ids = [first_sender&.id, last_sender&.id].compact.uniq - stats.keys
63+
if missing_ids.any?
64+
extra_stats = messages.where(sender_id: missing_ids)
65+
.group(:sender_id)
66+
.select('sender_id, COUNT(*) as message_count, MAX(messages.created_at) AS last_at')
67+
.index_by(&:sender_id)
68+
stats.merge!(extra_stats)
69+
end
70+
71+
sender_ids = stats.keys
72+
senders_by_id = Alias.includes(person: :contributor_memberships).where(id: sender_ids).index_by(&:id)
73+
74+
entry_for = lambda do |alias_record|
75+
return nil unless alias_record
76+
77+
stat = stats[alias_record.id]
78+
{
79+
alias: alias_record,
80+
message_count: stat&.read_attribute(:message_count)&.to_i,
81+
last_at: stat&.read_attribute(:last_at)
82+
}
83+
end
84+
85+
participants = []
86+
87+
participants << entry_for.call(first_sender) if first_sender
88+
89+
first_and_last = [first_sender&.id, last_sender&.id].compact.uniq
90+
other_senders = sender_ids - first_and_last
91+
remaining = [limit - first_and_last.length, 0].max
92+
other_participants = other_senders
93+
.map { |id| senders_by_id[id] }
94+
.compact
95+
.sort_by { |s| -stats[s.id].read_attribute(:message_count).to_i }
96+
.take(remaining)
97+
98+
participants.concat(other_participants.map { |alias_record| entry_for.call(alias_record) }.compact)
99+
100+
if last_sender && last_sender.id != first_sender&.id
101+
participants << entry_for.call(last_sender)
102+
end
103+
104+
participants.compact
105+
end
106+
52107
def has_contributor_activity?
53108
@has_contributor_activity ||= begin
54109
contributor_people = ContributorMembership.select(:person_id).distinct

app/views/topics/_avatar_list.slim

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
.participants
22
.participants-avatars
33
- participants.each do |participant|
4+
- alias_record = participant[:alias] || participant
5+
- next unless alias_record
6+
- message_count = participant[:message_count]
7+
- last_at = participant[:last_at]
8+
- tooltip_parts = []
9+
- tooltip_parts << pluralize(message_count, "message") if message_count
10+
- tooltip_parts << "last #{smart_time_display(last_at)}" if last_at
11+
- role_label = alias_record.contributor_badge || "User"
12+
- tooltip_parts << role_label
13+
- badge_text = tooltip_parts.any? ? tooltip_parts.join(", ") : "#{alias_record.name} (#{role_label})"
414
- css_classes = ["participant-avatar"]
5-
- css_classes << "is-core-team" if participant.core_team?
6-
- css_classes << "is-committer" if !participant.core_team? && participant.committer?
7-
- css_classes << "is-major-contributor" if !participant.core_team? && !participant.committer? && participant.major_contributor?
8-
- css_classes << "is-significant-contributor" if !participant.core_team? && !participant.committer? && !participant.major_contributor? && participant.significant_contributor?
9-
- css_classes << "is-past-contributor" if participant.past_contributor?
10-
- role_label = participant.contributor_badge || "User"
11-
- badge_text = "#{participant.name} (#{role_label})"
12-
= link_to person_path(participant.email), class: "participant-avatar-link" do
13-
= image_tag participant.display_gravatar_url(size: 32), class: css_classes.join(" "), alt: participant.name, title: badge_text
15+
- css_classes << "is-core-team" if alias_record.core_team?
16+
- css_classes << "is-committer" if !alias_record.core_team? && alias_record.committer?
17+
- css_classes << "is-major-contributor" if !alias_record.core_team? && !alias_record.committer? && alias_record.major_contributor?
18+
- css_classes << "is-significant-contributor" if !alias_record.core_team? && !alias_record.committer? && !alias_record.major_contributor? && alias_record.significant_contributor?
19+
- css_classes << "is-past-contributor" if alias_record.past_contributor?
20+
= link_to person_path(alias_record.email), class: "participant-avatar-link" do
21+
= image_tag alias_record.display_gravatar_url(size: 32), class: css_classes.join(" "), alt: alias_record.name, title: badge_text
1422
- if total_participants > participants.count
1523
span.participants-count +#{total_participants - participants.count}

app/views/topics/_topic_row_user.html.slim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ tr id=dom_id(topic) class="topic-row topic-#{state[:status] || 'new'}" data-topi
1313
.activity-replies = pluralize(replies_count, "reply")
1414
.activity-time title=absolute_time_display(last_message.created_at) = smart_time_display(last_message.created_at)
1515
td.topic-participants data-label="Participants"
16-
- participants = topic.participant_aliases(limit: 5)
16+
- participants = topic.participant_alias_stats(limit: 5)
1717
- participant_count = topic.participant_count
1818
= render partial: "avatar_list", locals: { participants: participants, total_participants: participant_count }
1919
- if topic.has_contributor_activity?

app/views/topics/_topics.html.slim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
.activity-replies = pluralize(replies_count, "reply")
99
.activity-time title=absolute_time_display(last_message.created_at) = smart_time_display(last_message.created_at)
1010
td.topic-participants data-label="Participants"
11-
- participants = topic.participant_aliases(limit: 5)
11+
- participants = topic.participant_alias_stats(limit: 5)
1212
- participant_count = topic.participant_count
1313
= render partial: "avatar_list", locals: { participants: participants, total_participants: participant_count }
1414
- if topic.has_contributor_activity?

0 commit comments

Comments
 (0)