##// END OF EJS Templates
Ability to sort issues by grouped column (#3511)....
Jean-Philippe Lang -
r10543:9f148e098b07
parent child
Show More
@@ -56,6 +56,7 class IssuesController < ApplicationController
56 retrieve_query
56 retrieve_query
57 sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
57 sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
58 sort_update(@query.sortable_columns)
58 sort_update(@query.sortable_columns)
59 @query.sort_criteria = sort_criteria.to_a
59
60
60 if @query.valid?
61 if @query.valid?
61 case params[:format]
62 case params[:format]
@@ -89,6 +89,10 module SortHelper
89 sql.blank? ? nil : sql
89 sql.blank? ? nil : sql
90 end
90 end
91
91
92 def to_a
93 @criteria.dup
94 end
95
92 def add!(key, asc)
96 def add!(key, asc)
93 @criteria.delete_if {|k,o| k == key}
97 @criteria.delete_if {|k,o| k == key}
94 @criteria = [[key, asc]] + @criteria
98 @criteria = [[key, asc]] + @criteria
@@ -182,6 +186,10 module SortHelper
182 @sort_criteria.to_sql
186 @sort_criteria.to_sql
183 end
187 end
184
188
189 def sort_criteria
190 @sort_criteria
191 end
192
185 # Returns a link which sorts by the named column.
193 # Returns a link which sorts by the named column.
186 #
194 #
187 # - column is the name of an attribute in the sorted record collection.
195 # - column is the name of an attribute in the sorted record collection.
@@ -542,7 +542,7 class Query < ActiveRecord::Base
542 if arg.is_a?(Hash)
542 if arg.is_a?(Hash)
543 arg = arg.keys.sort.collect {|k| arg[k]}
543 arg = arg.keys.sort.collect {|k| arg[k]}
544 end
544 end
545 c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, o == 'desc' ? o : 'asc']}
545 c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
546 write_attribute(:sort_criteria, c)
546 write_attribute(:sort_criteria, c)
547 end
547 end
548
548
@@ -558,12 +558,17 class Query < ActiveRecord::Base
558 sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
558 sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
559 end
559 end
560
560
561 def sort_criteria_order_for(key)
562 sort_criteria.detect {|k, order| key.to_s == k}.try(:last)
563 end
564
561 # Returns the SQL sort order that should be prepended for grouping
565 # Returns the SQL sort order that should be prepended for grouping
562 def group_by_sort_order
566 def group_by_sort_order
563 if grouped? && (column = group_by_column)
567 if grouped? && (column = group_by_column)
568 order = sort_criteria_order_for(column.name) || column.default_order
564 column.sortable.is_a?(Array) ?
569 column.sortable.is_a?(Array) ?
565 column.sortable.collect {|s| "#{s} #{column.default_order}"}.join(',') :
570 column.sortable.collect {|s| "#{s} #{order}"}.join(',') :
566 "#{column.sortable} #{column.default_order}"
571 "#{column.sortable} #{order}"
567 end
572 end
568 end
573 end
569
574
@@ -297,6 +297,26 class IssuesControllerTest < ActionController::TestCase
297 end
297 end
298 end
298 end
299
299
300 def test_index_with_query_grouped_by_tracker
301 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
302
303 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc'
304 assert_response :success
305
306 trackers = assigns(:issues).map(&:tracker).uniq
307 assert_equal [1, 2, 3], trackers.map(&:id)
308 end
309
310 def test_index_with_query_grouped_by_tracker_in_reverse_order
311 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
312
313 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc'
314 assert_response :success
315
316 trackers = assigns(:issues).map(&:tracker).uniq
317 assert_equal [3, 2, 1], trackers.map(&:id)
318 end
319
300 def test_index_with_query_id_and_project_id_should_set_session_query
320 def test_index_with_query_id_and_project_id_should_set_session_query
301 get :index, :project_id => 1, :query_id => 4
321 get :index, :project_id => 1, :query_id => 4
302 assert_response :success
322 assert_response :success
General Comments 0
You need to be logged in to leave comments. Login now