diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-06-22 15:35:11 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-06-22 15:35:11 +0000 |
commit | 0d5b03bab7338da4a5c456f21d18dd09308e0d8a (patch) | |
tree | 7ad69dd36856a69db0a3fe84f251f0687674e0c1 | |
parent | b025b63111089a5048f4fef5af30c98c0de26b8a (diff) | |
download | redmine-0d5b03bab7338da4a5c456f21d18dd09308e0d8a.tar.gz redmine-0d5b03bab7338da4a5c456f21d18dd09308e0d8a.zip |
Add filters on cross-project issue list for custom fields marked as 'For all projects'.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1576 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/models/query.rb | 49 | ||||
-rw-r--r-- | test/fixtures/custom_fields.yml | 1 | ||||
-rw-r--r-- | test/unit/query_test.rb | 6 |
3 files changed, 37 insertions, 19 deletions
diff --git a/app/models/query.rb b/app/models/query.rb index 77893bcf8..4c72e23f2 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -166,31 +166,20 @@ class Query < ActiveRecord::Base @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty? if project - # project specific filters - @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } } + # project specific filters + unless @project.issue_categories.empty? + @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } } + end unless @project.versions.empty? @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } } end unless @project.active_children.empty? @available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => @project.active_children.collect{|s| [s.name, s.id.to_s] } } end - @project.all_custom_fields.select(&:is_filter?).each do |field| - case field.field_format - when "text" - options = { :type => :text, :order => 20 } - when "list" - options = { :type => :list_optional, :values => field.possible_values, :order => 20} - when "date" - options = { :type => :date, :order => 20 } - when "bool" - options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 } - else - options = { :type => :string, :order => 20 } - end - @available_filters["cf_#{field.id}"] = options.merge({ :name => field.name }) - end - # remove category filter if no category defined - @available_filters.delete "category_id" if @available_filters["category_id"][:values].empty? + add_custom_fields_filters(@project.all_custom_fields) + else + # global filters for cross project issue list + add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true})) end @available_filters end @@ -368,4 +357,26 @@ class Query < ActiveRecord::Base (project_clauses + filters_clauses).join(' AND ') end + + private + + def add_custom_fields_filters(custom_fields) + @available_filters ||= {} + + custom_fields.select(&:is_filter?).each do |field| + case field.field_format + when "text" + options = { :type => :text, :order => 20 } + when "list" + options = { :type => :list_optional, :values => field.possible_values, :order => 20} + when "date" + options = { :type => :date, :order => 20 } + when "bool" + options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 } + else + options = { :type => :string, :order => 20 } + end + @available_filters["cf_#{field.id}"] = options.merge({ :name => field.name }) + end + end end diff --git a/test/fixtures/custom_fields.yml b/test/fixtures/custom_fields.yml index 3a9e79a29..9d88bc6fb 100644 --- a/test/fixtures/custom_fields.yml +++ b/test/fixtures/custom_fields.yml @@ -30,6 +30,7 @@ custom_fields_003: min_length: 0
regexp: ""
is_for_all: false
+ is_filter: true
type: ProjectCustomField
max_length: 0
possible_values: Stable|Beta|Alpha|Planning
diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 147bfbea3..3f77cd835 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -20,6 +20,12 @@ require File.dirname(__FILE__) + '/../test_helper' class QueryTest < Test::Unit::TestCase fixtures :projects, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries + def test_custom_fields_for_all_projects_should_be_available_in_global_queries + query = Query.new(:project => nil, :name => '_') + assert query.available_filters.has_key?('cf_1') + assert !query.available_filters.has_key?('cf_3') + end + def test_query_with_multiple_custom_fields query = Query.find(1) assert query.valid? |