]> source.dussan.org Git - redmine.git/commitdiff
Ability to sort issues by grouped column (#3511).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 29 Oct 2012 18:32:41 +0000 (18:32 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 29 Oct 2012 18:32:41 +0000 (18:32 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10765 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/helpers/sort_helper.rb
app/models/query.rb
test/functional/issues_controller_test.rb

index 816a3f52130d8d8eec0a32836dbed8cdf3ef8c46..d2096a3d297d0da453ad16d68f22665005b9892c 100644 (file)
@@ -56,6 +56,7 @@ class IssuesController < ApplicationController
     retrieve_query
     sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
     sort_update(@query.sortable_columns)
+    @query.sort_criteria = sort_criteria.to_a
 
     if @query.valid?
       case params[:format]
index 9fda5982b75a93a7ea75e6bf3631feb6b0542702..fd797951a5957e70ab2f137215c624caab91ed63 100644 (file)
@@ -89,6 +89,10 @@ module SortHelper
       sql.blank? ? nil : sql
     end
 
+    def to_a
+      @criteria.dup
+    end
+
     def add!(key, asc)
       @criteria.delete_if {|k,o| k == key}
       @criteria = [[key, asc]] + @criteria
@@ -182,6 +186,10 @@ module SortHelper
     @sort_criteria.to_sql
   end
 
+  def sort_criteria
+    @sort_criteria
+  end
+
   # Returns a link which sorts by the named column.
   #
   # - column is the name of an attribute in the sorted record collection.
index 64af16f5454f62ca532b635f2921e3896d10143f..efa161a6275d19b7c457aad39cf8d02b2b0c3727 100644 (file)
@@ -542,7 +542,7 @@ class Query < ActiveRecord::Base
     if arg.is_a?(Hash)
       arg = arg.keys.sort.collect {|k| arg[k]}
     end
-    c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, o == 'desc' ? o : 'asc']}
+    c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
     write_attribute(:sort_criteria, c)
   end
 
@@ -558,12 +558,17 @@ class Query < ActiveRecord::Base
     sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
   end
 
+  def sort_criteria_order_for(key)
+    sort_criteria.detect {|k, order| key.to_s == k}.try(:last)
+  end
+
   # Returns the SQL sort order that should be prepended for grouping
   def group_by_sort_order
     if grouped? && (column = group_by_column)
+      order = sort_criteria_order_for(column.name) || column.default_order
       column.sortable.is_a?(Array) ?
-        column.sortable.collect {|s| "#{s} #{column.default_order}"}.join(',') :
-        "#{column.sortable} #{column.default_order}"
+        column.sortable.collect {|s| "#{s} #{order}"}.join(',') :
+        "#{column.sortable} #{order}"
     end
   end
 
index a6917d2f91d2a79d4c40fb40ce8a86874c77e6e7..69545bf92a1c9e07b0dc06bcd319d5d9972b9b30 100644 (file)
@@ -297,6 +297,26 @@ class IssuesControllerTest < ActionController::TestCase
     end
   end
 
+  def test_index_with_query_grouped_by_tracker
+    3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
+
+    get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc'
+    assert_response :success
+
+    trackers = assigns(:issues).map(&:tracker).uniq
+    assert_equal [1, 2, 3], trackers.map(&:id)
+  end
+
+  def test_index_with_query_grouped_by_tracker_in_reverse_order
+    3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
+
+    get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc'
+    assert_response :success
+
+    trackers = assigns(:issues).map(&:tracker).uniq
+    assert_equal [3, 2, 1], trackers.map(&:id)
+  end
+
   def test_index_with_query_id_and_project_id_should_set_session_query
     get :index, :project_id => 1, :query_id => 4
     assert_response :success