diff --git a/app/models/project_query.rb b/app/models/project_query.rb index 72a0922bd..b8c79072f 100644 --- a/app/models/project_query.rb +++ b/app/models/project_query.rb @@ -69,7 +69,7 @@ class ProjectQuery < Query def available_columns return @available_columns if @available_columns @available_columns = self.class.available_columns.dup - @available_columns += ProjectCustomField.visible. + @available_columns += project_custom_fields.visible. map {|cf| QueryCustomFieldColumn.new(cf) } @available_columns end diff --git a/app/models/query.rb b/app/models/query.rb index 100728cff..31c5c911b 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -609,13 +609,13 @@ class Query < ActiveRecord::Base if project project.rolled_up_custom_fields else - IssueCustomField.all + IssueCustomField.sorted end end # Returns a scope of project custom fields that are available as columns or filters def project_custom_fields - ProjectCustomField.all + ProjectCustomField.sorted end # Returns a scope of project statuses that are available as columns or filters diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb index 610e7628e..39c931d4a 100644 --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -113,7 +113,7 @@ class TimeEntryQuery < Query map {|cf| QueryCustomFieldColumn.new(cf) } @available_columns += issue_custom_fields.visible. map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf, :totalable => false) } - @available_columns += ProjectCustomField.visible. + @available_columns += project_custom_fields.visible. map {|cf| QueryAssociationCustomFieldColumn.new(:project, cf) } @available_columns end diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 02cb25afd..adc8d0cff 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -1802,6 +1802,30 @@ class QueryTest < ActiveSupport::TestCase assert_include "cf_#{field.id}".to_sym, q.available_totalable_columns.map(&:name) end + def test_available_totalable_columns_should_sort_in_position_order_for_custom_field + ProjectCustomField.delete_all + cf_pos3 = ProjectCustomField.generate!(:position => 3, :is_for_all => true, :field_format => 'int') + cf_pos4 = ProjectCustomField.generate!(:position => 4, :is_for_all => true, :field_format => 'float') + cf_pos1 = ProjectCustomField.generate!(:position => 1, :is_for_all => true, :field_format => 'float') + cf_pos2 = ProjectCustomField.generate!(:position => 2, :is_for_all => true, :field_format => 'int') + q = ProjectQuery.new + custom_field_columns = q.available_totalable_columns.select{|column| column.is_a?(QueryCustomFieldColumn)} + assert_equal [cf_pos1, cf_pos2, cf_pos3, cf_pos4], custom_field_columns.collect(&:custom_field) + + q = TimeEntryQuery.new + custom_field_columns = q.available_totalable_columns.select{|column| column.is_a?(QueryCustomFieldColumn)} + assert_equal [cf_pos1, cf_pos2, cf_pos3, cf_pos4], custom_field_columns.collect(&:custom_field) + + IssueCustomField.delete_all + cf_pos3 = IssueCustomField.generate!(:position => 3, :is_for_all => true, :field_format => 'int') + cf_pos4 = IssueCustomField.generate!(:position => 4, :is_for_all => true, :field_format => 'float') + cf_pos1 = IssueCustomField.generate!(:position => 1, :is_for_all => true, :field_format => 'float') + cf_pos2 = IssueCustomField.generate!(:position => 2, :is_for_all => true, :field_format => 'int') + q = IssueQuery.new + custom_field_columns = q.available_totalable_columns.select{|column| column.is_a?(QueryCustomFieldColumn)} + assert_equal [cf_pos1, cf_pos2, cf_pos3, cf_pos4], custom_field_columns.collect(&:custom_field) + end + def test_total_for_estimated_hours Issue.delete_all Issue.generate!(:estimated_hours => 5.5)