mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-23 17:01:13 +00:00
Fix that totals of custom fields may not be sorted as configured (#33281).
Patch by Yuichi HARADA. git-svn-id: http://svn.redmine.org/redmine/trunk@19758 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
dc20ffcfae
commit
4fd0e739db
@ -69,7 +69,7 @@ class ProjectQuery < Query
|
|||||||
def available_columns
|
def available_columns
|
||||||
return @available_columns if @available_columns
|
return @available_columns if @available_columns
|
||||||
@available_columns = self.class.available_columns.dup
|
@available_columns = self.class.available_columns.dup
|
||||||
@available_columns += ProjectCustomField.visible.
|
@available_columns += project_custom_fields.visible.
|
||||||
map {|cf| QueryCustomFieldColumn.new(cf) }
|
map {|cf| QueryCustomFieldColumn.new(cf) }
|
||||||
@available_columns
|
@available_columns
|
||||||
end
|
end
|
||||||
|
|||||||
@ -609,13 +609,18 @@ class Query < ActiveRecord::Base
|
|||||||
if project
|
if project
|
||||||
project.rolled_up_custom_fields
|
project.rolled_up_custom_fields
|
||||||
else
|
else
|
||||||
IssueCustomField.all
|
IssueCustomField.sorted
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a scope of project custom fields that are available as columns or filters
|
# Returns a scope of project custom fields that are available as columns or filters
|
||||||
def project_custom_fields
|
def project_custom_fields
|
||||||
ProjectCustomField.all
|
ProjectCustomField.sorted
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a scope of time entry custom fields that are available as columns or filters
|
||||||
|
def time_entry_custom_fields
|
||||||
|
TimeEntryCustomField.sorted
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a scope of project statuses that are available as columns or filters
|
# Returns a scope of project statuses that are available as columns or filters
|
||||||
|
|||||||
@ -100,7 +100,7 @@ class TimeEntryQuery < Query
|
|||||||
add_available_filter "comments", :type => :text
|
add_available_filter "comments", :type => :text
|
||||||
add_available_filter "hours", :type => :float
|
add_available_filter "hours", :type => :float
|
||||||
|
|
||||||
add_custom_fields_filters(TimeEntryCustomField)
|
add_custom_fields_filters(time_entry_custom_fields)
|
||||||
add_associations_custom_fields_filters :project
|
add_associations_custom_fields_filters :project
|
||||||
add_custom_fields_filters(issue_custom_fields, :issue)
|
add_custom_fields_filters(issue_custom_fields, :issue)
|
||||||
add_associations_custom_fields_filters :user
|
add_associations_custom_fields_filters :user
|
||||||
@ -109,11 +109,11 @@ class TimeEntryQuery < Query
|
|||||||
def available_columns
|
def available_columns
|
||||||
return @available_columns if @available_columns
|
return @available_columns if @available_columns
|
||||||
@available_columns = self.class.available_columns.dup
|
@available_columns = self.class.available_columns.dup
|
||||||
@available_columns += TimeEntryCustomField.visible.
|
@available_columns += time_entry_custom_fields.visible.
|
||||||
map {|cf| QueryCustomFieldColumn.new(cf) }
|
map {|cf| QueryCustomFieldColumn.new(cf) }
|
||||||
@available_columns += issue_custom_fields.visible.
|
@available_columns += issue_custom_fields.visible.
|
||||||
map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf, :totalable => false) }
|
map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf, :totalable => false) }
|
||||||
@available_columns += ProjectCustomField.visible.
|
@available_columns += project_custom_fields.visible.
|
||||||
map {|cf| QueryAssociationCustomFieldColumn.new(:project, cf) }
|
map {|cf| QueryAssociationCustomFieldColumn.new(:project, cf) }
|
||||||
@available_columns
|
@available_columns
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1802,6 +1802,37 @@ class QueryTest < ActiveSupport::TestCase
|
|||||||
assert_include "cf_#{field.id}".to_sym, q.available_totalable_columns.map(&:name)
|
assert_include "cf_#{field.id}".to_sym, q.available_totalable_columns.map(&:name)
|
||||||
end
|
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)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
ProjectCustomField.delete_all
|
||||||
|
IssueCustomField.delete_all
|
||||||
|
TimeEntryCustomField.delete_all
|
||||||
|
cf_pos3 = TimeEntryCustomField.generate!(:position => 3, :is_for_all => true, :field_format => 'int')
|
||||||
|
cf_pos4 = TimeEntryCustomField.generate!(:position => 4, :is_for_all => true, :field_format => 'float')
|
||||||
|
cf_pos1 = TimeEntryCustomField.generate!(:position => 1, :is_for_all => true, :field_format => 'float')
|
||||||
|
cf_pos2 = TimeEntryCustomField.generate!(:position => 2, :is_for_all => true, :field_format => 'int')
|
||||||
|
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)
|
||||||
|
end
|
||||||
|
|
||||||
def test_total_for_estimated_hours
|
def test_total_for_estimated_hours
|
||||||
Issue.delete_all
|
Issue.delete_all
|
||||||
Issue.generate!(:estimated_hours => 5.5)
|
Issue.generate!(:estimated_hours => 5.5)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user