# HG changeset patch # User Toshi MARUYAMA # Date 1366638971 -32400 # Branch grouped_options_for_select-04 # Node ID 39b34e76c805cd37a6b534d84d76977bb906225c # Parent cc42770590653e4f52c4ed4602fe552e5f528c74 grouped_options_for_select diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -29,6 +29,20 @@ module QueriesHelper end end + def grouped_filters_options_for_select(query) + option_hash = ActiveSupport::OrderedHash.new + query.available_filters.each do |field, field_options| + group = field_options[:group] || :non_grouped + option_hash[group] ||= [] + option_hash[group] << [field_options[:name], field] + end + options = [] + option_hash.each do |k, v| + options << [(k == :non_grouped) ? "etc" : l(Query::GROUP_TYPES[k]), v] + end + grouped_options_for_select(options) + end + def query_filters_hidden_tags(query) tags = ''.html_safe query.filters.each do |field, options| diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -86,10 +86,10 @@ class IssueQuery < Query principals.uniq! principals.sort! users = principals.select {|p| p.is_a?(User)} - - add_available_filter "status_id", - :type => :list_status, :values => IssueStatus.sorted.all.collect{|s| [s.name, s.id.to_s] } - + add_available_filter("status_id", + :type => :list_status, + :values => IssueStatus.sorted.all.collect{|s| [s.name, s.id.to_s] }, + :group => :core) if project.nil? project_values = [] if User.current.logged? && User.current.memberships.any? @@ -97,77 +97,82 @@ class IssueQuery < Query end project_values += all_projects_values add_available_filter("project_id", - :type => :list, :values => project_values + :type => :list, :values => project_values, :group => :core ) unless project_values.empty? end - add_available_filter "tracker_id", - :type => :list, :values => trackers.collect{|s| [s.name, s.id.to_s] } - add_available_filter "priority_id", - :type => :list, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } - + add_available_filter("tracker_id", + :type => :list, :values => trackers.collect{|s| [s.name, s.id.to_s] }, + :group => :core) + add_available_filter("priority_id", + :type => :list, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] }, + :group => :core) author_values = [] author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? author_values += users.collect{|s| [s.name, s.id.to_s] } add_available_filter("author_id", - :type => :list, :values => author_values + :type => :list, :values => author_values, :group => :core ) unless author_values.empty? - assigned_to_values = [] assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? assigned_to_values += (Setting.issue_group_assignment? ? principals : users).collect{|s| [s.name, s.id.to_s] } add_available_filter("assigned_to_id", - :type => :list_optional, :values => assigned_to_values + :type => :list_optional, :values => assigned_to_values, :group => :core ) unless assigned_to_values.empty? group_values = Group.all.collect {|g| [g.name, g.id.to_s] } add_available_filter("member_of_group", - :type => :list_optional, :values => group_values + :type => :list_optional, :values => group_values, :group => :core ) unless group_values.empty? role_values = Role.givable.collect {|r| [r.name, r.id.to_s] } add_available_filter("assigned_to_role", - :type => :list_optional, :values => role_values + :type => :list_optional, :values => role_values, :group => :core ) unless role_values.empty? if versions.any? - add_available_filter "fixed_version_id", + add_available_filter("fixed_version_id", :type => :list_optional, - :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } + :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] }, + :group => :core) end if categories.any? - add_available_filter "category_id", + add_available_filter("category_id", :type => :list_optional, - :values => categories.collect{|s| [s.name, s.id.to_s] } + :values => categories.collect{|s| [s.name, s.id.to_s] }, + :group => :core) end - add_available_filter "subject", :type => :text - add_available_filter "created_on", :type => :date_past - add_available_filter "updated_on", :type => :date_past - add_available_filter "closed_on", :type => :date_past - add_available_filter "start_date", :type => :date - add_available_filter "due_date", :type => :date - add_available_filter "estimated_hours", :type => :float - add_available_filter "done_ratio", :type => :integer + add_available_filter("subject", :type => :text, :group => :core) + add_available_filter("created_on", :type => :date_past, :group => :core) + add_available_filter("updated_on", :type => :date_past, :group => :core) + add_available_filter("closed_on", :type => :date_past, :group => :core) + add_available_filter("start_date", :type => :date, :group => :core) + add_available_filter("due_date", :type => :date, :group => :core) + add_available_filter("estimated_hours", :type => :float, :group => :core) + add_available_filter("done_ratio", :type => :integer, :group => :core) if User.current.allowed_to?(:set_issues_private, nil, :global => true) || User.current.allowed_to?(:set_own_issues_private, nil, :global => true) - add_available_filter "is_private", + add_available_filter("is_private", :type => :list, - :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]] + :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], + :group => :core) end if User.current.logged? - add_available_filter "watcher_id", - :type => :list, :values => [["<< #{l(:label_me)} >>", "me"]] + add_available_filter("watcher_id", + :type => :list, :values => [["<< #{l(:label_me)} >>", "me"]], + :group => :core) end if subprojects.any? - add_available_filter "subproject_id", + add_available_filter("subproject_id", :type => :list_subprojects, - :values => subprojects.collect{|s| [s.name, s.id.to_s] } + :values => subprojects.collect{|s| [s.name, s.id.to_s] }, + :group => :core) end add_custom_fields_filters(issue_custom_fields) @@ -175,7 +180,8 @@ class IssueQuery < Query add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version IssueRelation::TYPES.each do |relation_type, options| - add_available_filter relation_type, :type => :relation, :label => options[:name] + add_available_filter(relation_type, :type => :relation, + :label => options[:name], :group => :relation) end Tracker.disabled_core_fields(trackers).each {|field| diff --git a/app/models/query.rb b/app/models/query.rb --- a/app/models/query.rb +++ b/app/models/query.rb @@ -116,6 +116,12 @@ class Query < ActiveRecord::Base class StatementInvalid < ::ActiveRecord::StatementInvalid end + GROUP_TYPES = { + :core => :field_core_fields, + :relation => :label_related_issues, + :custom_field => :label_custom_field_plural, + }.freeze + belongs_to :project belongs_to :user serialize :filters @@ -760,11 +766,12 @@ class Query < ActiveRecord::Base filter_id = "#{assoc}.#{filter_id}" filter_name = l("label_attribute_of_#{assoc}", :name => filter_name) end - add_available_filter filter_id, options.merge({ + add_available_filter(filter_id, options.merge({ :name => filter_name, :format => field.field_format, - :field => field - }) + :field => field, + :group => :custom_field + })) end end diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -36,17 +36,17 @@ class TimeEntryQuery < Query end def initialize_available_filters - add_available_filter "spent_on", :type => :date_past - + add_available_filter("spent_on", :type => :date_past, :group => :core) principals = [] if project principals += project.principals.sort unless project.leaf? subprojects = project.descendants.visible.all if subprojects.any? - add_available_filter "subproject_id", + add_available_filter("subproject_id", :type => :list_subprojects, - :values => subprojects.collect{|s| [s.name, s.id.to_s] } + :values => subprojects.collect{|s| [s.name, s.id.to_s] }, + :group => :core) principals += Principal.member_of(subprojects) end end @@ -61,7 +61,7 @@ class TimeEntryQuery < Query end project_values += all_projects_values add_available_filter("project_id", - :type => :list, :values => project_values + :type => :list, :values => project_values, :group => :core ) unless project_values.empty? end end @@ -73,16 +73,17 @@ class TimeEntryQuery < Query users_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? users_values += users.collect{|s| [s.name, s.id.to_s] } add_available_filter("user_id", - :type => :list_optional, :values => users_values + :type => :list_optional, :values => users_values, :group => :core ) unless users_values.empty? activities = (project ? project.activities : TimeEntryActivity.shared.active) add_available_filter("activity_id", - :type => :list, :values => activities.map {|a| [a.name, a.id.to_s]} + :type => :list, :values => activities.map {|a| [a.name, a.id.to_s]}, + :group => :core ) unless activities.empty? - add_available_filter "comments", :type => :text - add_available_filter "hours", :type => :float + add_available_filter("comments", :type => :text, :group => :core) + add_available_filter("hours", :type => :float, :group => :core) add_custom_fields_filters(TimeEntryCustomField.where(:is_filter => true).all) add_associations_custom_fields_filters :project, :issue, :user diff --git a/app/views/queries/_filters.html.erb b/app/views/queries/_filters.html.erb --- a/app/views/queries/_filters.html.erb +++ b/app/views/queries/_filters.html.erb @@ -20,7 +20,10 @@ var allProjects = <%= raw query.all_proj <%= label_tag('add_filter_select', l(:label_filter_add)) %> -<%= select_tag 'add_filter_select', filters_options_for_select(query), :name => nil %> +<%= select_tag('add_filter_select', + content_tag(:option).html_safe + + grouped_filters_options_for_select(query), + :name => nil) %> diff --git a/public/javascripts/application.js b/public/javascripts/application.js --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -106,7 +106,7 @@ function addFilter(field, operator, valu } $('#cb_'+fieldId).attr('checked', true); toggleFilter(field); - $('#add_filter_select').val('').children('option').each(function() { + $('#add_filter_select').val('').children('optgroup').children('option').each(function() { if ($(this).attr('value') == field) { $(this).attr('disabled', true); }