mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-19 15:01:14 +00:00
Parent issue autocomplete does not follow to the "Allow cross-project subtasks" setting (#14281).
git-svn-id: http://svn.redmine.org/redmine/trunk@13400 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
1a9f4c8014
commit
51db15ac61
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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' %>
|
||||
|
||||
69
test/unit/issue_scopes_test.rb
Normal file
69
test/unit/issue_scopes_test.rb
Normal file
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user