diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb index c8f8eeaeb..59a4f25ca 100644 --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -23,7 +23,7 @@ class TimeEntryQuery < Query self.available_columns = [ QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true), - QueryColumn.new(:spent_on, :sortable => ["#{TimeEntry.table_name}.spent_on", "#{TimeEntry.table_name}.created_on"], :default_order => 'desc', :groupable => true), + QueryColumn.new(:spent_on, :sortable => "#{TimeEntry.table_name}.spent_on", :default_order => 'desc', :groupable => true), TimestampQueryColumn.new(:created_on, :sortable => "#{TimeEntry.table_name}.created_on", :default_order => 'desc', :groupable => true), QueryColumn.new(:tweek, :sortable => ["#{TimeEntry.table_name}.spent_on", "#{TimeEntry.table_name}.created_on"], :caption => :label_week), QueryColumn.new(:author, :sortable => lambda {User.fields_for_order_statement}), @@ -152,7 +152,12 @@ class TimeEntryQuery < Query def results_scope(options={}) order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) - order_option << "#{TimeEntry.table_name}.id ASC" + order_option << + if order_option.reverse.find{|order| order.match?(/#{TimeEntry.table_name}\./)}&.match?(/\sDESC$/i) + "#{TimeEntry.table_name}.id DESC" + else + "#{TimeEntry.table_name}.id ASC" + end base_scope. order(order_option). joins(joins_for_order_statement(order_option.join(','))) diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb index 77b2cd66e..38b5dcfcb 100644 --- a/test/functional/timelog_controller_test.rb +++ b/test/functional/timelog_controller_test.rb @@ -1128,6 +1128,32 @@ class TimelogControllerTest < Redmine::ControllerTest assert_equal [t3, t1, t2].map(&:id).map(&:to_s), css_select('input[name="ids[]"]').map {|e| e.attr('value')} end + def test_index_should_sort_by_spent_on_and_user + user1 = User.find(1) # Redmine Admin + user2 = User.find(2) # John Smith + t1 = TimeEntry.generate!(:spent_on => '2012-06-16', :user => user2) + t2 = TimeEntry.generate!(:spent_on => '2012-06-16', :user => user1) + t3 = TimeEntry.generate!(:spent_on => '2012-06-15', :user => user2) + + params = { + :project_id => 1, + :f => ['spent_on'], + :op => {'spent_on' => '><'}, + :v => {'spent_on' => ['2012-06-15', '2012-06-16']} + } + + [ + [{:sort => 'spent_on,user'}, [t3, t1, t2]], + [{:sort => 'spent_on,user:desc'}, [t3, t2, t1]], + [{:sort => 'spent_on:desc,user'}, [t1, t2, t3]], + [{:sort => 'spent_on:desc,user:desc'}, [t2, t1, t3]], + ].each do |sort_criteria, expect| + get :index, :params => params.dup.merge(sort_criteria) + assert_response :success + assert_equal expect.map(&:id).map(&:to_s), css_select('input[name="ids[]"]').map {|e| e.attr('value')} + end + end + def test_index_with_activity_filter activity = TimeEntryActivity.create!(:name => 'Activity') entry = TimeEntry.generate!(:issue_id => 1, :hours => 4.5, :activity => activity)