]> source.dussan.org Git - redmine.git/commitdiff
Parent issue autocomplete does not follow to the "Allow cross-project subtasks" setti...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Sep 2014 10:42:31 +0000 (10:42 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Sep 2014 10:42:31 +0000 (10:42 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@13400 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/auto_completes_controller.rb
app/models/issue.rb
app/views/issues/_attributes.html.erb
test/unit/issue_scopes_test.rb [new file with mode: 0644]

index e9834ebb525e4d0d33c1d35c6b280f4361941295..a48afdf90cb150a9c5dc3a403eb2abdf06fa6e91 100644 (file)
@@ -22,7 +22,7 @@ class AutoCompletesController < ApplicationController
     @issues = []
     q = (params[:q] || params[:term]).to_s.strip
     if q.present?
-      scope = (params[:scope] == "all" || @project.nil? ? Issue : @project.issues).visible
+      scope = Issue.cross_project_scope(@project, params[:scope]).visible
       if q.match(/\A#?(\d+)\z/)
         @issues << scope.find_by_id($1.to_i)
       end
index d3b2311c81af11ce825013b095ba95be6719a07f..dd6361e9e7d2460088aeda1f31616201b61c5e8f 100644 (file)
@@ -1160,6 +1160,28 @@ class Issue < ActiveRecord::Base
     end
   end
 
+  # Returns an issue scope based on project and scope
+  def self.cross_project_scope(project, scope=nil)
+    if project.nil?
+      return Issue
+    end
+    case scope
+    when 'all', 'system'
+      Issue
+    when 'tree'
+      Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt)",
+                                  :lft => project.root.lft, :rgt => project.root.rgt)
+    when 'hierarchy'
+      Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt) OR (#{Project.table_name}.lft < :lft AND #{Project.table_name}.rgt > :rgt)",
+                                  :lft => project.lft, :rgt => project.rgt)
+    when 'descendants'
+      Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt)",
+                                  :lft => project.lft, :rgt => project.rgt)
+    else
+      Issue.where(:project_id => project.id)
+    end
+  end
+
   # Extracted from the ReportsController.
   def self.by_tracker(project)
     count_and_group_by(:project => project,
index 0e29701c62c7329a627684a5b3e8625ddcadb0a9..7cae91f0c4f4324edb19dc7fb9ccea9a38c06e81 100644 (file)
@@ -43,7 +43,7 @@
 <div class="splitcontentright">
 <% if @issue.safe_attribute? 'parent_issue_id' %>
 <p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10, :required => @issue.required_attribute?('parent_issue_id') %></p>
-<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path}')" %>
+<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @issue.project, :scope => Setting.cross_project_subtasks)}')" %>
 <% end %>
 
 <% if @issue.safe_attribute? 'start_date' %>
diff --git a/test/unit/issue_scopes_test.rb b/test/unit/issue_scopes_test.rb
new file mode 100644 (file)
index 0000000..36919b8
--- /dev/null
@@ -0,0 +1,69 @@
+# Redmine - project management software
+# Copyright (C) 2006-2014  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../test_helper', __FILE__)
+
+class IssueScopesTest < ActiveSupport::TestCase
+  fixtures :projects, :users, :members, :member_roles, :roles,
+           :groups_users,
+           :trackers, :projects_trackers,
+           :enabled_modules,
+           :versions, :issue_statuses, :issue_categories, :enumerations,
+           :issues,
+           :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values
+
+  def test_cross_project_scope_without_project_should_return_all_issues
+    ids = Issue.cross_project_scope(nil).pluck(:id).sort
+    assert_equal Issue.pluck(:id).sort, ids
+  end
+
+  def test_cross_project_scope_with_project_should_return_project_issues
+    project = Project.find(1)
+    ids = Issue.cross_project_scope(project).pluck(:id).sort
+    assert_equal project.issues.pluck(:id).sort, ids
+  end
+
+  def test_cross_project_scope_with_all_scope_should_return_all_issues
+    project = Project.find(1)
+    ids = Issue.cross_project_scope(project, 'all').pluck(:id).sort
+    assert_equal Issue.pluck(:id).sort, ids
+  end
+
+  def test_cross_project_scope_with_system_scope_should_return_all_issues
+    project = Project.find(1)
+    ids = Issue.cross_project_scope(project, 'system').pluck(:id).sort
+    assert_equal Issue.pluck(:id).sort, ids
+  end
+
+  def test_cross_project_scope_with_tree_scope_should_return_tree_issues
+    project = Project.find(5)
+    ids = Issue.cross_project_scope(project, 'tree').pluck(:id).sort
+    assert_equal project.root.self_and_descendants.map{|p| p.issues.pluck(:id)}.flatten.sort, ids
+  end
+
+  def test_cross_project_scope_with_hierarchy_scope_should_return_hierarchy_issues
+    project = Project.find(5)
+    ids = Issue.cross_project_scope(project, 'hierarchy').pluck(:id).sort
+    assert_equal (project.self_and_descendants + project.ancestors).map{|p| p.issues.pluck(:id)}.flatten.sort, ids
+  end
+
+  def test_cross_project_scope_with_descendants_scope_should_return_descendants_issues
+    project = Project.find(5)
+    ids = Issue.cross_project_scope(project, 'descendants').pluck(:id).sort
+    assert_equal project.self_and_descendants.map{|p| p.issues.pluck(:id)}.flatten.sort, ids
+  end
+end