Defect #33912

Sorting of multiple columns including Date column does not work

Added by Yuichi HARADA 2 months ago. Updated about 1 month ago.

Status:NewStart date:
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:Time tracking
Target version:-
Resolution: Affected version:

Description

When specifying the sorting condition of multiple columns including Date column in the custom query, sorting of columns after Date column does not work.

  • Defining a custom query
  • List of spent time with custom query

customquery.png (115 KB) Yuichi HARADA, 2020-08-27 07:17

spenttime-with-customquery.png (155 KB) Yuichi HARADA, 2020-08-27 07:21

fixed-33912.patch Magnifier (3.17 KB) Yuichi HARADA, 2020-09-02 07:30

History

#1 Updated by Yuichi HARADA about 1 month ago

I think the following patch will fix the problem.

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(',')))

Also available in: Atom PDF