diff --git a/CHANGELOG-EE b/CHANGELOG-EE index a9985968398df3d9050fb8f65b68d965e8d934d8..ae8533966dde38a8dfad0be9cfa7f7989877261c 100644 --- a/CHANGELOG-EE +++ b/CHANGELOG-EE @@ -4,6 +4,7 @@ v 8.5.0 (unreleased) - Show warning when mirror repository default branch could not be updated because it has diverged from upstream. - More reliable wiki indexer - GitLab Pages gets support for custom domain and custom certificate + - Add ability to sort issues by weight (Daniel Hoffmann) v 8.4.4 - Re-introduce "Send email to users" link in Admin area diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb index 241179b0212b4522bae07a594c0d6e1d62e25326..3bd61c46b864e6df4c2d6d732ec7b7f08a196af0 100644 --- a/app/helpers/sorting_helper.rb +++ b/app/helpers/sorting_helper.rb @@ -11,6 +11,8 @@ def sort_options_hash sort_value_largest_repo => sort_title_largest_repo, sort_value_recently_signin => sort_title_recently_signin, sort_value_oldest_signin => sort_title_oldest_signin, + sort_value_weight_highest => sort_title_weight_highest, + sort_value_weight_lowest => sort_title_weight_lowest } end @@ -54,6 +56,14 @@ def sort_title_oldest_signin 'Oldest sign in' end + def sort_title_weight_highest + 'Highest weight' + end + + def sort_title_weight_lowest + 'Lowest weight' + end + def sort_value_oldest_updated 'updated_asc' end @@ -93,4 +103,12 @@ def sort_value_recently_signin def sort_value_oldest_signin 'oldest_sign_in' end + + def sort_value_weight_highest + 'weight_desc' + end + + def sort_value_weight_lowest + 'weight_asc' + end end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 5136d0196a5f71f72c31b06ae5d2fe0811d2e5c8..ec8d42f75667807733c8fe85234645f9d793e165 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -35,6 +35,8 @@ module Issuable scope :closed, -> { with_state(:closed) } scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } + scope :order_weight_desc, -> { reorder('weight IS NULL, weight DESC') } + scope :order_weight_asc, -> { reorder('weight IS NULL, weight ASC') } scope :join_project, -> { joins(:project) } scope :references_project, -> { references(:project) } @@ -69,6 +71,8 @@ def sort(method) case method.to_s when 'milestone_due_asc' then order_milestone_due_asc when 'milestone_due_desc' then order_milestone_due_desc + when 'weight_asc' then order_weight_asc + when 'weight_desc' then order_weight_desc else order_by(method) end diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index f09ab25276da1d33263420e4ed8fca6e2c6d9758..da28ea62bc900f217266b50714e53faef18ce086 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -16,6 +16,10 @@ = sort_title_recently_updated = link_to page_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated + = link_to page_filter_path(sort: sort_value_weight_highest) do + = sort_title_weight_highest + = link_to page_filter_path(sort: sort_value_weight_lowest) do + = sort_title_weight_lowest = link_to page_filter_path(sort: sort_value_milestone_soon) do = sort_title_milestone_soon = link_to page_filter_path(sort: sort_value_milestone_later) do diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb index 600089802b2a4bed2e4eb4e8c49551845b2dfa93..8b6009e9bd75ad99e8f36d566495a477d83ac232 100644 --- a/spec/models/concerns/issuable_spec.rb +++ b/spec/models/concerns/issuable_spec.rb @@ -124,4 +124,20 @@ expect(issue.downvotes).to eq(1) end end + + context 'weight' do + let!(:issue_no_weight) { create :issue } + let!(:issue_low_weight) { create :issue, weight: 1 } + let!(:issue_high_weight) { create :issue, weight: 9 } + + describe 'sorts by weight' do + it 'sorts correctly ascending' do + expect(described_class.sort('weight_asc').map(&:weight)).to eq [1, 9, nil] + end + + it 'sorts correctly descending' do + expect(described_class.sort('weight_desc').map(&:weight)).to eq [9, 1, nil] + end + end + end end