FEATURE: Order pinned topics by their pinned_at column (#14090)

Currently, pinned topics are ordered by the `bumped_at` column. This behavior is not desired because it gives admins no control over the order of pinned topics. This PR makes pinned topics ordered by the `pinned_at` column. A topic that is pinned last appears first in topic lists. If an admin wants an already pinned topic to appear first in the list of pinned topics, they'll have to unpin that topic and pin it again.

Meta topic: https://meta.discourse.org/t/how-do-i-set-the-order-of-pinned-topics/16935/23?u=osama.
This commit is contained in:
Osama Sayegh 2021-08-19 14:43:58 +03:00 committed by GitHub
parent 46cdddbac9
commit ec352a1969
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 1 deletions

View File

@ -390,7 +390,7 @@ class TopicQuery
end end
unpinned_topics = topics.where("NOT ( #{pinned_clause} )") unpinned_topics = topics.where("NOT ( #{pinned_clause} )")
pinned_topics = topics.dup.offset(nil).where(pinned_clause) pinned_topics = topics.dup.offset(nil).where(pinned_clause).reorder(pinned_at: :desc)
per_page = options[:per_page] || per_page_setting per_page = options[:per_page] || per_page_setting
limit = per_page unless options[:limit] == false limit = per_page unless options[:limit] == false

View File

@ -97,6 +97,63 @@ describe TopicQuery do
page: 1) page: 1)
).to eq(topics[per_page...num_topics]) ).to eq(topics[per_page...num_topics])
end end
it "orders globally pinned topics by pinned_at rather than bumped_at" do
pinned1 = Fabricate(
:topic,
bumped_at: 3.hour.ago,
pinned_at: 1.hours.ago,
pinned_until: 10.days.from_now,
pinned_globally: true
)
pinned2 = Fabricate(
:topic,
bumped_at: 2.hour.ago,
pinned_at: 4.hours.ago,
pinned_until: 10.days.from_now,
pinned_globally: true
)
unpinned1 = Fabricate(:topic, bumped_at: 2.hour.ago)
unpinned2 = Fabricate(:topic, bumped_at: 3.hour.ago)
topic_query = TopicQuery.new(user)
results = topic_query.send(:default_results)
expected_order = [pinned1, pinned2, unpinned1, unpinned2].map(&:id)
expect(topic_query
.prioritize_pinned_topics(results, per_page: 10, page: 0)
.pluck(:id)
).to eq(expected_order)
end
it "orders pinned topics within a category by pinned_at rather than bumped_at" do
cat = Fabricate(:category)
pinned1 = Fabricate(
:topic,
category: cat,
bumped_at: 3.hour.ago,
pinned_at: 1.hours.ago,
pinned_until: 10.days.from_now,
)
pinned2 = Fabricate(
:topic,
category: cat,
bumped_at: 2.hour.ago,
pinned_at: 4.hours.ago,
pinned_until: 10.days.from_now,
)
unpinned1 = Fabricate(:topic, category: cat, bumped_at: 2.hour.ago)
unpinned2 = Fabricate(:topic, category: cat, bumped_at: 3.hour.ago)
topic_query = TopicQuery.new(user)
results = topic_query.send(:default_results)
expected_order = [pinned1, pinned2, unpinned1, unpinned2].map(&:id)
expect(topic_query
.prioritize_pinned_topics(results, per_page: 10, page: 0, category_id: cat.id)
.pluck(:id)
).to eq(expected_order)
end
end end
context 'bookmarks' do context 'bookmarks' do