Project

General

Profile

Feature #27988 » 0002-Add-subtask-link-should-open-the-new-issue-form-with-v2.patch

The modified patch - Andrea Bonadei, 2019-11-15 12:03

View differences:

app/helpers/issues_helper.rb
183 183
  # Returns a link for adding a new subtask to the given issue
184 184
  def link_to_new_subtask(issue)
185 185
    attrs = {
186
      :parent_issue_id => issue
186
      :parent_issue_id => issue,
187
      :parent_tracker_id => issue.tracker_id
187 188
    }
188
    attrs[:tracker_id] = issue.tracker unless issue.tracker.disabled_core_fields.include?('parent_issue_id')
189 189
    link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs, :back_url => issue_path(issue)))
190 190
  end
191 191

  
192 192
  def trackers_options_for_select(issue)
193 193
    trackers = issue.allowed_target_trackers
194 194
    if issue.new_record? && issue.parent_issue_id.present?
195
      trackers = trackers.reject do |tracker|
196
        issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id')
195
      if params['issue'].present? && params['issue']['parent_tracker_id'].present?
196
        parent_tracker_id = params['issue']['parent_tracker_id'].to_i
197
      else
198
        parent_tracker_id = Issue.find_by_id(issue.parent_issue_id).tracker.id
197 199
      end
200

  
201
      allowed_subtask_ids = Tracker.find(parent_tracker_id).allowed_subtask_ids
202
      trackers = trackers.reject {|t| !allowed_subtask_ids.include?(t.id)}
203
      issue.tracker_id = trackers.detect{|t| t.id == parent_tracker_id} ? parent_tracker_id : trackers.first unless params['issue']['tracker_id'].present?
198 204
    end
199 205
    trackers.collect {|t| [t.name, t.id]}
200 206
  end
app/models/tracker.rb
141 141
    end
142 142
  end
143
  def allowed_subtask_ids
144
    self.subtasks.map(&:id)
145
  end
146

  
143 147
  def allowed_subtask?(subtask_id)
144 148
    self.subtasks.where(:trackers_subtasks => { :subtask_id => subtask_id }).exists?
145 149
  end
150
  def can_have_subtasks?
151
    @can_have_subtasks ||= self.subtasks.any?
152
  end
146 153
private
147 154
  def check_integrity
148 155
    raise Exception.new("Cannot delete tracker") if Issue.where(:tracker_id => self.id).any?
app/views/issues/show.html.erb
96 96
<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
97
<% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %>
97
<% if !@issue.leaf? || (User.current.allowed_to?(:manage_subtasks, @project) && @issue.tracker.can_have_subtasks?) %>
98 98
<hr />
99 99
<div id="issue_tree">
100 100
<div class="contextual">
101
  <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %>
101
  <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) && @issue.tracker.can_have_subtasks? %>
102 102
</div>
103 103
<p><strong><%=l(:label_subtask_plural)%></strong></p>
104 104
<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %>
test/functional/issues_controller_test.rb
28 28
           :issue_relations,
29 29
           :versions,
30 30
           :trackers,
31
           :trackers_subtasks,
31 32
           :projects_trackers,
32 33
           :issue_categories,
33 34
           :enabled_modules,
......
2477 2478
    end
2478 2479
  end
2479
  def test_new_with_parent_issue_id_should_default_to_first_tracker_without_disabled_parent_field
2480
  def test_new_with_parent_issue_id_should_default_to_first_valid_tracker
2480 2481
    tracker = Tracker.find(1)
2481 2482
    tracker.core_fields -= ['parent_issue_id']
2483
    tracker.subtask_ids = [2]
2482 2484
    tracker.save!
2483 2485
    @request.session[:user_id] = 2
......
2491 2493
      }
2492 2494
    assert_response :success
2493 2495
    assert_select 'select[name=?]', 'issue[tracker_id]' do
2494
      assert_select 'option', 2
2496
      assert_select 'option', 1
2495 2497
      assert_select 'option[value="2"][selected=selected]'
2498
      assert_select 'option[value="3"]', 0
2496 2499
      assert_select 'option[value="1"]', 0
2497 2500
    end
2498 2501
  end
2502
  def test_new_with_parent_issue_id_should_default_to_same_tracker_if_is_valid
2503
    @request.session[:user_id] = 2
2504
    get :new, :params => {
2505
        :project_id => 1,
2506
        :issue => {
2507
          :parent_issue_id => 2
2508
        }
2509
      }
2510
    assert_response :success
2511
    assert_select 'select[name=?]', 'issue[tracker_id]' do
2512
      assert_select 'option', 3
2513
      assert_select 'option[value="2"][selected=selected]'
2514
    end
2515
  end
2516

  
2499 2517
  def test_new_without_allowed_trackers_should_respond_with_403
2500 2518
    role = Role.find(1)
2501 2519
    role.set_permission_trackers 'add_issues', []
......
6574 6592
      end
6575 6593
    end
6576 6594
  end
6595

  
6596
  def test_show_should_display_subtasks_section_for_issue_with_subtasks_and_which_cannot_have_subtasks
6597
    Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
6598
    tracker = Tracker.find(1)
6599
    tracker.subtask_ids = ['']
6600
    tracker.save!
6601

  
6602
    @request.session[:user_id] = 1
6603
    get :show, :params => {
6604
        :id => 1
6605
      }
6606
    assert_response :success
6607

  
6608
    assert_select 'div#issue_tree' do
6609
      # assert that the subtasks are listed
6610
      assert_select 'td.subject', :text => /Child Issue/
6611
      # assert that the link for adding subtask is not shown
6612
      assert_select 'div.contextual a', 0
6613
    end
6614
  end
6615

  
6616
  def test_show_should_not_display_subtasks_section_for_issue_without_subtasks_and_which_cannot_have_subtasks
6617
    tracker = Tracker.find(1)
6618
    tracker.subtask_ids = ['']
6619
    tracker.save!
6620

  
6621
    @request.session[:user_id] = 1
6622
    get :show, :params => {
6623
        :id => 1
6624
      }
6625
    assert_response :success
6626

  
6627
    assert_select 'div#issue_tree', 0
6628
  end
6629

  
6630
  def test_show_add_subtask_link_should_include_parent_tracker_id
6631
    @request.session[:user_id] = 1
6632
    get :show, :params => {
6633
      :id => 1
6634
    }
6635
    assert_response :success
6636

  
6637
    assert_select 'div#issue_tree div.contextual a[href*=?]', "parent_tracker_id%5D=1"
6638
  end
6639

  
6640

  
6577 6641
end
(7-7/7)