FIX: Sorting toggles on topic list (#24465)

- Correctly interpret string queryParams
- On first click of a new column, use "descending". Otherwise, toggle.
- Add system specs for behavior
This commit is contained in:
David Taylor 2023-11-20 17:45:13 +00:00 committed by GitHub
parent 36606a2157
commit 299989b85e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 6 deletions

View File

@ -24,7 +24,7 @@ export default class DiscoveryTopics extends Component {
} }
get ascending() { get ascending() {
return this.args.model.get("params.ascending"); return this.args.model.get("params.ascending") === "true";
} }
get hasTopics() { get hasTopics() {

View File

@ -101,6 +101,16 @@ export default class DiscoveryListController extends Controller {
return this.model.category && !this.createTopicTargetCategory; return this.model.category && !this.createTopicTargetCategory;
} }
get resolvedAscending() {
return (
(this.ascending ?? this.model.list.get("params.ascending")) === "true"
);
}
get resolvedOrder() {
return this.order ?? this.model.list.get("params.order") ?? "activity";
}
@action @action
createTopic() { createTopic() {
this.composer.openNewTopic({ this.composer.openNewTopic({
@ -120,14 +130,12 @@ export default class DiscoveryListController extends Controller {
@action @action
changeSort(sortBy) { changeSort(sortBy) {
if (sortBy === this.order) { if (sortBy === this.resolvedOrder) {
this.ascending = !this.ascending; this.ascending = !this.resolvedAscending;
this.model.list.updateSortParams(sortBy, this.ascending);
} else { } else {
this.order = sortBy;
this.ascending = false; this.ascending = false;
this.model.list.updateSortParams(sortBy, false);
} }
this.order = sortBy;
} }
@action @action

View File

@ -0,0 +1,41 @@
# frozen_string_literal: true
describe "Topic list focus", type: :system do
fab!(:topics) { Fabricate.times(10, :post).map(&:topic) }
fab!(:reply) { Fabricate(:post, topic: topics.first) }
let(:discovery) { PageObjects::Pages::Discovery.new }
def nth_topic_id(n)
discovery.topic_list.find(".topic-list-item:nth-of-type(#{n})")["data-topic-id"]
end
it "can sort a topic list by activity" do
visit "/latest"
expect(discovery.topic_list).to have_topics(count: 10)
newest_topic_id = nth_topic_id(1)
find("th[data-sort-order='activity']").click
expect(page).to have_css("th[data-sort-order='activity'][aria-sort=ascending]")
expect(nth_topic_id(10)).to eq(newest_topic_id)
find("th[data-sort-order='activity']").click
expect(page).to have_css("th[data-sort-order='activity'][aria-sort=descending]")
expect(nth_topic_id(1)).to eq(newest_topic_id)
end
it "can sort a topic list by replies" do
visit "/latest"
expect(discovery.topic_list).to have_topics(count: 10)
find("th[data-sort-order='posts']").click
expect(page).to have_css("th[data-sort-order='posts'][aria-sort=descending]")
expect(nth_topic_id(1)).to eq(reply.topic_id.to_s)
find("th[data-sort-order='posts']").click
expect(page).to have_css("th[data-sort-order='posts'][aria-sort=ascending]")
expect(nth_topic_id(10)).to eq(reply.topic_id.to_s)
end
end