diff --git a/app/models/query.rb b/app/models/query.rb index 97a635c..5094cc3 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -85,6 +85,28 @@ class QueryCustomFieldColumn < QueryColumn end end +class QueryAssociationCustomFieldColumn < QueryCustomFieldColumn + + def initialize(association, custom_field) + super(custom_field) + self.name = "#{association}.cf_#{custom_field.id}".to_sym + # TODO: support sorting/grouping by association custom field + self.sortable = false + self.groupable = false + @association = association + end + + def value(object) + if assoc = object.send(@association) + super(assoc) + end + end + + def css_classes + @css_classes ||= "#{@association}_cf_#{@cf.id} #{@cf.field_format}" + end +end + class Query < ActiveRecord::Base class StatementInvalid < ::ActiveRecord::StatementInvalid end diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb index 9ffa5f1..7283fbd 100644 --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -100,6 +100,7 @@ class TimeEntryQuery < Query return @available_columns if @available_columns @available_columns = self.class.available_columns.dup @available_columns += TimeEntryCustomField.all.map {|cf| QueryCustomFieldColumn.new(cf) } + @available_columns += IssueCustomField.all.map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf) } @available_columns end diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb index cb81a41..ae0561b 100644 --- a/test/functional/timelog_controller_test.rb +++ b/test/functional/timelog_controller_test.rb @@ -528,6 +528,16 @@ class TimelogControllerTest < ActionController::TestCase assert_equal [entry], assigns(:entries) end + def test_index_with_issue_custom_field_column + issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {2 => 'filter_on_issue_custom_field'}) + entry = TimeEntry.generate!(:issue => issue, :hours => 2.5) + + get :index, :c => %w(project spent_on issue comments hours issue.cf_2) + assert_response :success + assert_include :'issue.cf_2', assigns(:query).column_names + assert_select 'td.issue_cf_2', :text => 'filter_on_issue_custom_field' + end + def test_index_atom_feed get :index, :project_id => 1, :format => 'atom' assert_response :success