From 79ccd01a855c7db25b2bd74b8f75b682b315b2a5 Mon Sep 17 00:00:00 2001 From: Marius BALTEANU Date: Tue, 1 May 2018 09:00:16 +0000 Subject: [PATCH 2/3] Add subtask link should open the new issue form with a valid tracker --- app/helpers/issues_helper.rb | 14 +++++-- app/models/tracker.rb | 7 ++++ app/views/issues/show.html.erb | 4 +- test/functional/issues_controller_test.rb | 68 ++++++++++++++++++++++++++++++- 4 files changed, 85 insertions(+), 8 deletions(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 1c2fd1b..65c803d 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -183,18 +183,24 @@ module IssuesHelper # Returns a link for adding a new subtask to the given issue def link_to_new_subtask(issue) attrs = { - :parent_issue_id => issue + :parent_issue_id => issue, + :parent_tracker_id => issue.tracker_id } - attrs[:tracker_id] = issue.tracker unless issue.tracker.disabled_core_fields.include?('parent_issue_id') link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs, :back_url => issue_path(issue))) end def trackers_options_for_select(issue) trackers = issue.allowed_target_trackers if issue.new_record? && issue.parent_issue_id.present? - trackers = trackers.reject do |tracker| - issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id') + if params['issue'].present? && params['issue']['parent_tracker_id'].present? + parent_tracker_id = params['issue']['parent_tracker_id'].to_i + else + parent_tracker_id = Issue.find_by_id(issue.parent_issue_id).tracker.id end + + allowed_subtask_ids = Tracker.find(parent_tracker_id).allowed_subtask_ids + trackers = trackers.reject {|t| !allowed_subtask_ids.include?(t.id)} + issue.tracker_id = trackers.detect{|t| t.id == parent_tracker_id} ? parent_tracker_id : trackers.first end trackers.collect {|t| [t.name, t.id]} end diff --git a/app/models/tracker.rb b/app/models/tracker.rb index 5548751..af2c7ab 100644 --- a/app/models/tracker.rb +++ b/app/models/tracker.rb @@ -141,10 +141,17 @@ class Tracker < ActiveRecord::Base end end + def allowed_subtask_ids + self.subtasks.map(&:id) + end + def allowed_subtask?(subtask_id) self.subtasks.where(:trackers_subtasks => { :subtask_id => subtask_id }).exists? end + def can_have_subtasks? + @can_have_subtasks ||= self.subtasks.any? + end private def check_integrity raise Exception.new("Cannot delete tracker") if Issue.where(:tracker_id => self.id).any? diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index f1f2791..fcfc0de 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -96,11 +96,11 @@ end %> <%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> -<% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %> +<% if !@issue.leaf? || (User.current.allowed_to?(:manage_subtasks, @project) && @issue.tracker.can_have_subtasks?) %>
- <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %> + <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) && @issue.tracker.can_have_subtasks? %>

<%=l(:label_subtask_plural)%>

<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %> diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index fc5b035..1c3560a 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -28,6 +28,7 @@ class IssuesControllerTest < Redmine::ControllerTest :issue_relations, :versions, :trackers, + :trackers_subtasks, :projects_trackers, :issue_categories, :enabled_modules, @@ -2477,9 +2478,10 @@ class IssuesControllerTest < Redmine::ControllerTest end end - def test_new_with_parent_issue_id_should_default_to_first_tracker_without_disabled_parent_field + def test_new_with_parent_issue_id_should_default_to_first_valid_tracker tracker = Tracker.find(1) tracker.core_fields -= ['parent_issue_id'] + tracker.subtask_ids = [2] tracker.save! @request.session[:user_id] = 2 @@ -2491,12 +2493,28 @@ class IssuesControllerTest < Redmine::ControllerTest } assert_response :success assert_select 'select[name=?]', 'issue[tracker_id]' do - assert_select 'option', 2 + assert_select 'option', 1 assert_select 'option[value="2"][selected=selected]' + assert_select 'option[value="3"]', 0 assert_select 'option[value="1"]', 0 end end + def test_new_with_parent_issue_id_should_default_to_same_tracker_if_is_valid + @request.session[:user_id] = 2 + get :new, :params => { + :project_id => 1, + :issue => { + :parent_issue_id => 2 + } + } + assert_response :success + assert_select 'select[name=?]', 'issue[tracker_id]' do + assert_select 'option', 3 + assert_select 'option[value="2"][selected=selected]' + end + end + def test_new_without_allowed_trackers_should_respond_with_403 role = Role.find(1) role.set_permission_trackers 'add_issues', [] @@ -6574,4 +6592,50 @@ class IssuesControllerTest < Redmine::ControllerTest end end end + + def test_show_should_display_subtasks_section_for_issue_with_subtasks_and_which_cannot_have_subtasks + Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue') + tracker = Tracker.find(1) + tracker.subtask_ids = [''] + tracker.save! + + @request.session[:user_id] = 1 + get :show, :params => { + :id => 1 + } + assert_response :success + + assert_select 'div#issue_tree' do + # assert that the subtasks are listed + assert_select 'td.subject', :text => /Child Issue/ + # assert that the link for adding subtask is not shown + assert_select 'div.contextual a', 0 + end + end + + def test_show_should_not_display_subtasks_section_for_issue_without_subtasks_and_which_cannot_have_subtasks + tracker = Tracker.find(1) + tracker.subtask_ids = [''] + tracker.save! + + @request.session[:user_id] = 1 + get :show, :params => { + :id => 1 + } + assert_response :success + + assert_select 'div#issue_tree', 0 + end + + def test_show_add_subtask_link_should_include_parent_tracker_id + @request.session[:user_id] = 1 + get :show, :params => { + :id => 1 + } + assert_response :success + + assert_select 'div#issue_tree div.contextual a[href*=?]', "parent_tracker_id%5D=1" + end + + end -- 2.1.4