diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index fd92af1..e9aa7e7 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -24,13 +24,15 @@ module QueriesHelper ungrouped = [] grouped = {} query.available_filters.map do |field, field_options| - if [:tree, :relation].include?(field_options[:type]) + if [:tree, :relation].include?(field_options[:type]) group = :label_relations elsif field =~ /^(.+)\./ # association filters - group = "field_#{$1}" + group = "field_#{$1}".to_sym elsif %w(member_of_group assigned_to_role).include?(field) group = :field_assigned_to + elsif %w(fixed_version_effective_date fixed_version_status).include?(field) + group = :field_fixed_version elsif field_options[:type] == :date_past || field_options[:type] == :date group = :label_date end @@ -41,7 +43,7 @@ module QueriesHelper end end # Don't group dates if there's only one (eg. time entries filters) - if grouped[:label_date].try(:size) == 1 + if grouped[:label_date].try(:size) == 1 ungrouped << grouped.delete(:label_date).first end s = options_for_select([[]] + ungrouped) @@ -134,7 +136,7 @@ module QueriesHelper column_value(column, issue, value) end end - + def column_value(column, issue, value) case column.name when :id diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index c4ab37d..7bb7a0e 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -203,6 +203,15 @@ class IssueQuery < Query :type => :list_optional, :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } + add_available_filter "fixed_version_effective_date", + :type => :date, + :name => l(:label_attribute_of_fixed_version, :name => l(:field_effective_date)) + + add_available_filter "fixed_version_status", + :type => :list, + :name => l(:label_attribute_of_fixed_version, :name => l(:field_status)), + :values => Version::VERSION_STATUSES.map{|t| [t, t] } + add_available_filter "category_id", :type => :list_optional, :values => categories.collect{|s| [s.name, s.id.to_s] } @@ -300,7 +309,7 @@ class IssueQuery < Query end def base_scope - Issue.visible.joins(:status, :project).where(statement) + Issue.visible.joins(:status, :project).eager_load(:fixed_version).where(statement) end # Returns the issue count @@ -463,6 +472,14 @@ class IssueQuery < Query end end + def sql_for_fixed_version_status_field(field, operator, value) + sql_for_field(field, operator, value, Version.table_name, "status") + end + + def sql_for_fixed_version_effective_date_field(field, operator, value) + sql_for_field(field, operator, value, Version.table_name, "effective_date") + end + def sql_for_is_private_field(field, operator, value) op = (operator == "=" ? 'IN' : 'NOT IN') va = value.map {|v| v == '0' ? self.class.connection.quoted_false : self.class.connection.quoted_true}.uniq.join(',') diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 2515624..1c1b7f1 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -119,7 +119,7 @@ class QueryTest < ActiveSupport::TestCase end def find_issues_with_query(query) - Issue.joins(:status, :tracker, :project, :priority).where( + Issue.joins(:status, :tracker, :project, :priority).eager_load(:fixed_version).where( query.statement ).to_a end @@ -811,6 +811,26 @@ class QueryTest < ActiveSupport::TestCase assert_equal [2], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort end + def test_filter_on_fixed_version_effective_date + query = IssueQuery.new(:name => '_') + filter_name = "fixed_version_effective_date" + assert_include filter_name, query.available_filters.keys + query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_s(:db)]}} + assert_equal [2], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort + + query = IssueQuery.new(:name => '_') + query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_s(:db)]}} + assert_equal [], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort + end + + def test_filter_on_fixed_version_status + query = IssueQuery.new(:name => '_') + filter_name = "fixed_version_status" + assert_include filter_name, query.available_filters.keys + query.filters = {filter_name => {:operator => '=', :values => ['closed']}} + assert_equal [1], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort + end + def test_filter_on_relations_with_a_specific_issue IssueRelation.delete_all IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(2)) @@ -943,7 +963,7 @@ class QueryTest < ActiveSupport::TestCase def test_filter_on_parent Issue.delete_all parent = Issue.generate_with_descendants! - + query = IssueQuery.new(:name => '_') query.filters = {"parent_id" => {:operator => '=', :values => [parent.id.to_s]}} @@ -973,7 +993,7 @@ class QueryTest < ActiveSupport::TestCase parent = Issue.generate_with_descendants! child, leaf = parent.children.sort_by(&:id) grandchild = child.children.first - + query = IssueQuery.new(:name => '_') query.filters = {"child_id" => {:operator => '=', :values => [grandchild.id.to_s]}}