mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
DEV: Extend /filter's ability to order (#28242)
This commit is contained in:
parent
5dbf812d32
commit
a49a6941c6
|
@ -549,14 +549,21 @@ class TopicsFilter
|
||||||
|
|
||||||
def order_by(values:)
|
def order_by(values:)
|
||||||
values.each do |value|
|
values.each do |value|
|
||||||
|
# If the order by value is not recognized, check if it is a custom filter.
|
||||||
match_data = value.match(ORDER_BY_REGEXP)
|
match_data = value.match(ORDER_BY_REGEXP)
|
||||||
|
|
||||||
if match_data && column_name = ORDER_BY_MAPPINGS.dig(match_data[:order_by], :column)
|
if match_data && column_name = ORDER_BY_MAPPINGS.dig(match_data[:order_by], :column)
|
||||||
if scope = ORDER_BY_MAPPINGS.dig(match_data[:order_by], :scope)
|
if scope = ORDER_BY_MAPPINGS.dig(match_data[:order_by], :scope)
|
||||||
@scope = instance_exec(&scope)
|
@scope = instance_exec(&scope)
|
||||||
end
|
end
|
||||||
|
|
||||||
@scope = @scope.order("#{column_name} #{match_data[:asc] ? "ASC" : "DESC"}")
|
@scope = @scope.order("#{column_name} #{match_data[:asc] ? "ASC" : "DESC"}")
|
||||||
|
else
|
||||||
|
match_data = value.match /^(?<column>.*?)(?:-(?<asc>asc))?$/
|
||||||
|
key = "order:#{match_data[:column]}"
|
||||||
|
if custom_match =
|
||||||
|
DiscoursePluginRegistry.custom_filter_mappings.find { |hash| hash.key?(key) }
|
||||||
|
@scope = custom_match[key].call(@scope, match_data[:asc].nil? ? "DESC" : "ASC")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1349,6 +1349,13 @@ RSpec.describe TopicsFilter do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "ordering topics filter" do
|
describe "ordering topics filter" do
|
||||||
|
before do
|
||||||
|
Plugin::Instance.new.add_filter_custom_filter(
|
||||||
|
"order:wrongly",
|
||||||
|
&->(scope) { scope.order("wrongly") }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
# Requires the fabrication of `topic`, `topic2` and `topic3` such that the order of the topics is `topic2`, `topic1`, `topic3`
|
# Requires the fabrication of `topic`, `topic2` and `topic3` such that the order of the topics is `topic2`, `topic1`, `topic3`
|
||||||
# when ordered by the given filter in descending order.
|
# when ordered by the given filter in descending order.
|
||||||
shared_examples "ordering topics filters" do |order, order_description|
|
shared_examples "ordering topics filters" do |order, order_description|
|
||||||
|
@ -1500,6 +1507,38 @@ RSpec.describe TopicsFilter do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "for DiscoursePluginRegistry.custom_filter_mappings" do
|
||||||
|
describe "when extending order:{col}" do
|
||||||
|
fab!(:earlier_topic) { Fabricate(:topic, bumped_at: 2.hours.ago) }
|
||||||
|
fab!(:now_topic) { Fabricate(:topic, bumped_at: Time.now) }
|
||||||
|
|
||||||
|
before_all do
|
||||||
|
Plugin::Instance.new.add_filter_custom_filter(
|
||||||
|
"order:bumped",
|
||||||
|
&->(scope, value) { scope.order("bumped_at #{value}") }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "applies ASC order correctly" do
|
||||||
|
expect(
|
||||||
|
TopicsFilter
|
||||||
|
.new(guardian: Guardian.new)
|
||||||
|
.filter_from_query_string("order:bumped-asc")
|
||||||
|
.pluck(:id),
|
||||||
|
).to eq([earlier_topic.id, now_topic.id])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "applies default order correctly" do
|
||||||
|
expect(
|
||||||
|
TopicsFilter
|
||||||
|
.new(guardian: Guardian.new)
|
||||||
|
.filter_from_query_string("order:bumped")
|
||||||
|
.pluck(:id),
|
||||||
|
).to eq([now_topic.id, earlier_topic.id])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user