FIX: sort chat channels by slug (#25656)
Channels can include emojis in front of the channel title which causes problems when sorting. Using the channel slug is a more reliable way to sort and avoid these kind of issues.
This commit is contained in:
parent
949b5f3fa9
commit
85001a27e9
|
@ -120,7 +120,7 @@ export default class ChatChannelsManager extends Service {
|
||||||
if (this.site.mobileView) {
|
if (this.site.mobileView) {
|
||||||
return this.#sortChannelsByActivity(channels);
|
return this.#sortChannelsByActivity(channels);
|
||||||
} else {
|
} else {
|
||||||
return channels.sort((a, b) => a?.title?.localeCompare?.(b?.title));
|
return channels.sort((a, b) => a?.slug?.localeCompare?.(b?.slug));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,27 +161,27 @@ export default class ChatChannelsManager extends Service {
|
||||||
|
|
||||||
#sortChannelsByActivity(channels) {
|
#sortChannelsByActivity(channels) {
|
||||||
return channels.sort((a, b) => {
|
return channels.sort((a, b) => {
|
||||||
// if both channels have mention count, sort by aplhabetical order
|
// if both channels have mention count, sort by slug
|
||||||
// otherwise prioritize channel with mention count
|
// otherwise prioritize channel with mention count
|
||||||
if (a.tracking.mentionCount > 0 && b.tracking.mentionCount > 0) {
|
if (a.tracking.mentionCount > 0 && b.tracking.mentionCount > 0) {
|
||||||
return a.title?.localeCompare?.(b.title);
|
return a.slug?.localeCompare?.(b.slug);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a.tracking.mentionCount > 0 || b.tracking.mentionCount > 0) {
|
if (a.tracking.mentionCount > 0 || b.tracking.mentionCount > 0) {
|
||||||
return a.tracking.mentionCount > b.tracking.mentionCount ? -1 : 1;
|
return a.tracking.mentionCount > b.tracking.mentionCount ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if both channels have unread count, sort by aplhabetical order
|
// if both channels have unread count, sort by slug
|
||||||
// otherwise prioritize channel with unread count
|
// otherwise prioritize channel with unread count
|
||||||
if (a.tracking.unreadCount > 0 && b.tracking.unreadCount > 0) {
|
if (a.tracking.unreadCount > 0 && b.tracking.unreadCount > 0) {
|
||||||
return a.title?.localeCompare?.(b.title);
|
return a.slug?.localeCompare?.(b.slug);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a.tracking.unreadCount > 0 || b.tracking.unreadCount > 0) {
|
if (a.tracking.unreadCount > 0 || b.tracking.unreadCount > 0) {
|
||||||
return a.tracking.unreadCount > b.tracking.unreadCount ? -1 : 1;
|
return a.tracking.unreadCount > b.tracking.unreadCount ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.title?.localeCompare?.(b.title);
|
return a.slug?.localeCompare?.(b.slug);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ RSpec.describe "List channels | mobile", type: :system, mobile: true do
|
||||||
channel_4.add(current_user)
|
channel_4.add(current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "sorts them by mentions, unread, then alphabetical order" do
|
it "sorts them by mentions, unread, then by slug" do
|
||||||
Jobs.run_immediately!
|
Jobs.run_immediately!
|
||||||
|
|
||||||
Fabricate(
|
Fabricate(
|
||||||
|
@ -92,7 +92,7 @@ RSpec.describe "List channels | mobile", type: :system, mobile: true do
|
||||||
expect(page.find("#public-channels a:nth-child(1)")["data-chat-channel-id"]).to eq(
|
expect(page.find("#public-channels a:nth-child(1)")["data-chat-channel-id"]).to eq(
|
||||||
channel_4.id.to_s,
|
channel_4.id.to_s,
|
||||||
)
|
)
|
||||||
# channels with unread messages are next, sorted by title
|
# channels with unread messages are next
|
||||||
expect(page.find("#public-channels a:nth-child(2)")["data-chat-channel-id"]).to eq(
|
expect(page.find("#public-channels a:nth-child(2)")["data-chat-channel-id"]).to eq(
|
||||||
channel_1.id.to_s,
|
channel_1.id.to_s,
|
||||||
)
|
)
|
||||||
|
@ -100,6 +100,24 @@ RSpec.describe "List channels | mobile", type: :system, mobile: true do
|
||||||
channel_2.id.to_s,
|
channel_2.id.to_s,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with emojis in title" do
|
||||||
|
before do
|
||||||
|
channel_1.update!(name: ":pear: a channel")
|
||||||
|
channel_2.update!(name: ":apple: b channel")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "sorts them by slug" do
|
||||||
|
visit("/chat/channels")
|
||||||
|
|
||||||
|
expect(page.find("#public-channels a:nth-child(1)")["data-chat-channel-id"]).to eq(
|
||||||
|
channel_1.id.to_s,
|
||||||
|
)
|
||||||
|
expect(page.find("#public-channels a:nth-child(2)")["data-chat-channel-id"]).to eq(
|
||||||
|
channel_2.id.to_s,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when direct message channels" do
|
context "when direct message channels" do
|
||||||
|
|
Loading…
Reference in New Issue