diff --git a/app/assets/javascripts/discourse/controllers/review-index.js.es6 b/app/assets/javascripts/discourse/controllers/review-index.js.es6 index 5c950982b61..9b88af4e01c 100644 --- a/app/assets/javascripts/discourse/controllers/review-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/review-index.js.es6 @@ -7,7 +7,8 @@ export default Ember.Controller.extend({ "status", "category_id", "topic_id", - "username" + "username", + "sort_order" ], type: null, status: "pending", @@ -17,6 +18,7 @@ export default Ember.Controller.extend({ topic_id: null, filtersExpanded: false, username: "", + sort_order: "priority", init(...args) { this._super(...args); @@ -44,6 +46,18 @@ export default Ember.Controller.extend({ }); }, + @computed + sortOrders() { + return ["priority", "priority_asc", "created_at", "created_at_asc"].map( + order => { + return { + id: order, + name: I18n.t(`review.filters.orders.${order}`) + }; + } + ); + }, + @computed statuses() { return [ @@ -86,7 +100,8 @@ export default Ember.Controller.extend({ priority: this.filterPriority, status: this.filterStatus, category_id: this.filterCategoryId, - username: this.filterUsername + username: this.filterUsername, + sort_order: this.filterSortOrder }); this.send("refreshRoute"); }, diff --git a/app/assets/javascripts/discourse/routes/review-index.js.es6 b/app/assets/javascripts/discourse/routes/review-index.js.es6 index 01ff4e588db..b6ba62ab451 100644 --- a/app/assets/javascripts/discourse/routes/review-index.js.es6 +++ b/app/assets/javascripts/discourse/routes/review-index.js.es6 @@ -20,7 +20,8 @@ export default Discourse.Route.extend({ filterCategoryId: meta.category_id, filterPriority: meta.priority, reviewableTypes: meta.reviewable_types, - filterUsername: meta.username + filterUsername: meta.username, + filterSortOrder: meta.sort_order }); }, diff --git a/app/assets/javascripts/discourse/templates/review-index.hbs b/app/assets/javascripts/discourse/templates/review-index.hbs index b4770800db9..a7cd4c95a7e 100644 --- a/app/assets/javascripts/discourse/templates/review-index.hbs +++ b/app/assets/javascripts/discourse/templates/review-index.hbs @@ -55,6 +55,11 @@ {{d-button label="review.show_all_topics" icon="times" action=(action "resetTopic")}} {{/if}} + +
+ {{i18n "review.order_by"}} + {{combo-box value=filterSortOrder content=sortOrders}} +
{{/if}}
diff --git a/app/controllers/reviewables_controller.rb b/app/controllers/reviewables_controller.rb index 8d6818d8232..d2bed1f9e48 100644 --- a/app/controllers/reviewables_controller.rb +++ b/app/controllers/reviewables_controller.rb @@ -26,7 +26,8 @@ class ReviewablesController < ApplicationController topic_id: topic_id, priority: params[:priority], username: params[:username], - type: params[:type] + type: params[:type], + sort_order: params[:sort_order] } total_rows = Reviewable.list_for(current_user, filters).count diff --git a/app/models/reviewable.rb b/app/models/reviewable.rb index 00a9eb911d5..bebf7102ca9 100644 --- a/app/models/reviewable.rb +++ b/app/models/reviewable.rb @@ -383,10 +383,21 @@ class Reviewable < ActiveRecord::Base limit: nil, offset: nil, priority: nil, - username: nil + username: nil, + sort_order: nil ) min_score = Reviewable.min_score_for_priority(priority) - order = (status == :pending) ? 'score DESC, created_at DESC' : 'created_at DESC' + + order = case sort_order + when 'priority_asc' + 'score ASC, created_at DESC' + when 'created_at' + 'created_at DESC, score DESC' + when 'created_at_asc' + 'created_at ASC, score DESC' + else + 'score DESC, created_at DESC' + end if username.present? user_id = User.find_by_username(username)&.id diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 0a761e5df04..034699edba9 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -363,6 +363,7 @@ en: placeholder: "type the message title here" review: + order_by: "Order by" in_reply_to: "in reply to" claim_help: optional: "You can claim this item to prevent others from reviewing it." @@ -442,6 +443,12 @@ en: refresh: "Refresh" status: "Status" category: "Category" + orders: + priority: "Priority" + priority_asc: "Priority (reverse)" + created_at: "Created At" + created_at_asc: "Created At (reverse)" + priority: title: "Minimum Priority" low: "Low" diff --git a/spec/models/reviewable_spec.rb b/spec/models/reviewable_spec.rb index afcbcdfe985..3cc85cf55a8 100644 --- a/spec/models/reviewable_spec.rb +++ b/spec/models/reviewable_spec.rb @@ -151,11 +151,30 @@ RSpec.describe Reviewable, type: :model do it 'Does not filter by status when status parameter is set to all' do rejected_reviewable = Fabricate(:reviewable, target: post, status: Reviewable.statuses[:rejected]) - reviewables = Reviewable.list_for(user, status: :all) - expect(reviewables).to match_array [reviewable, rejected_reviewable] end + + it "supports sorting" do + r0 = Fabricate(:reviewable, score: 100, created_at: 3.months.ago) + r1 = Fabricate(:reviewable, score: 999, created_at: 1.month.ago) + + list = Reviewable.list_for(user, sort_order: 'priority') + expect(list[0].id).to eq(r1.id) + expect(list[1].id).to eq(r0.id) + + list = Reviewable.list_for(user, sort_order: 'priority_asc') + expect(list[0].id).to eq(r0.id) + expect(list[1].id).to eq(r1.id) + + list = Reviewable.list_for(user, sort_order: 'created_at') + expect(list[0].id).to eq(r1.id) + expect(list[1].id).to eq(r0.id) + + list = Reviewable.list_for(user, sort_order: 'created_at_asc') + expect(list[0].id).to eq(r0.id) + expect(list[1].id).to eq(r1.id) + end end end