diff --git app/controllers/projects_controller.rb app/controllers/projects_controller.rb index 7e1798a..c8ed22b5 100644 --- app/controllers/projects_controller.rb +++ app/controllers/projects_controller.rb @@ -160,6 +160,9 @@ class ProjectsController < ApplicationController @issue_custom_fields = IssueCustomField.sorted.to_a @issue_category ||= IssueCategory.new @member ||= @project.members.new + @versions ||= @project.shared_versions(params[:version]) + @version_status = params[:version] && params[:version][:status] + @version_name = params[:version] && params[:version][:name] @trackers = Tracker.sorted.to_a @wiki ||= @project.wiki || Wiki.new(:project => @project) end diff --git app/helpers/projects_helper.rb app/helpers/projects_helper.rb index 6a47b1e..f610aa4 100644 --- app/helpers/projects_helper.rb +++ app/helpers/projects_helper.rb @@ -100,6 +100,16 @@ module ProjectsHelper l("label_version_sharing_#{sharing}") end + def version_status_check_group(checked_status) + checked_status ||= Version::VERSION_STATUSES + content = "" + Version::VERSION_STATUSES.each do |s| + content += check_box_tag('version[status][]', s, checked_status.include?(s), :id => "version_status_#{s}", :onchange => "this.form.submit(); return false;") + content += content_tag('label', l("version_status_#{s}"), :for => "version_status_#{s}") + end + content.html_safe + end + def render_boards_tree(boards, parent=nil, level=0, &block) selection = boards.select {|b| b.parent == parent} return '' if selection.empty? diff --git app/models/project.rb app/models/project.rb index 2e3a106..11cbe6e 100644 --- app/models/project.rb +++ app/models/project.rb @@ -453,7 +453,7 @@ class Project < ActiveRecord::Base end # Returns a scope of the Versions used by the project - def shared_versions + def shared_versions(conditions = nil) if new_record? Version. joins(:project). @@ -473,6 +473,11 @@ class Project < ActiveRecord::Base " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + "))") end + if conditions.is_a?(Hash) && conditions.any? + @shared_versions = @shared_versions.where("#{Version.table_name}.status IN (?)", conditions[:status]) if conditions[:status].is_a?(Array) + @shared_versions = @shared_versions.where("#{Version.table_name}.name LIKE ?", "%#{conditions[:name]}%") if conditions[:name].present? + end + @shared_versions end end diff --git app/views/projects/settings/_versions.html.erb app/views/projects/settings/_versions.html.erb index d33788a..abb23d3 100644 --- app/views/projects/settings/_versions.html.erb +++ app/views/projects/settings/_versions.html.erb @@ -1,4 +1,15 @@ -<% if @project.shared_versions.any? %> +<%= form_tag(settings_project_path(:tab => 'versions'), :method => :get) do %> +
<%= l(:label_filter_plural) %> + <%= version_status_check_group(@version_status) %> + + <%= text_field_tag 'version[name]', @version_name, :size => 30 %> + <%= submit_tag l(:button_apply), :class => "small", :name => nil %> + <%= link_to l(:button_clear), settings_project_path(:tab => 'versions'), :class => 'icon icon-reload' %> +
+<% end %> +  + +<% if @versions && @versions.any? %> @@ -10,7 +21,7 @@ -<% for version in @project.shared_versions.sort %> +<% for version in @versions.sort %> diff --git test/functional/projects_controller_test.rb test/functional/projects_controller_test.rb index 55dbeef..07df93e 100644 --- test/functional/projects_controller_test.rb +++ test/functional/projects_controller_test.rb @@ -423,6 +423,16 @@ class ProjectsControllerTest < ActionController::TestCase assert_template 'settings' end + def test_settings_with_version_parameters_should_assigns_matched_versions + @request.session[:user_id] = 2 # manager + version_parameters = {:status => ['open']} + get :settings, :id => 1, :version => version_parameters + assert_response :success + assert_template 'settings' + assert assigns(:versions) + assert_equal Project.find(1).shared_versions(version_parameters), assigns(:versions) + end + def test_settings_of_subproject @request.session[:user_id] = 2 get :settings, :id => 'private-child' diff --git test/unit/project_test.rb test/unit/project_test.rb index 5c305f7..6304313 100644 --- test/unit/project_test.rb +++ test/unit/project_test.rb @@ -633,6 +633,32 @@ class ProjectTest < ActiveSupport::TestCase assert_include v, Project.new.shared_versions end + def test_shared_versions_with_status_conditions_should_returns_filterd_versions + p = Project.find(5) + Version.update_all(:status => 'closed') + open_version = Version.create!(:name => 'open version', :project => p, :status => 'open') + locked_version = Version.create!(:name => 'locked version', :project => p, :status => 'locked') + + versions = p.shared_versions(:status => ['open', 'locked']) + assert_equal 2, versions.size + assert_include open_version, versions + assert_include locked_version, versions + end + + def test_shared_versions_with_name_conditions_should_returns_filterd_versions + p = Project.find(5) + Version.update_all(:name => 'unmatch versoin') + open_version = Version.create!(:name => 'version first open', :project => p, :status => 'open') + locked_version = Version.create!(:name => 'second version locked', :project => p, :status => 'locked') + closed_version = Version.create!(:name => 'last closed version', :project => p, :status => 'closed') + + versions = p.shared_versions(:name => 'version') + assert_equal 3, versions.size + assert_include open_version, versions + assert_include locked_version, versions + assert_include locked_version, versions + end + def test_next_identifier ProjectCustomField.delete_all Project.create!(:name => 'last', :identifier => 'p2008040')
<%= l(:label_version) %>
<%= link_to_version version %> <%= format_date(version.effective_date) %>