mirror of
https://github.com/redmine/redmine.git
synced 2025-11-14 01:06:00 +01:00
Query links for related issues on issue page (#35559).
Patch by Takenori TAKAKI. git-svn-id: http://svn.redmine.org/redmine/trunk@21200 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -152,36 +152,44 @@ module IssuesHelper
|
|||||||
|
|
||||||
open_subtasks = subtasks_grouped[false].to_i
|
open_subtasks = subtasks_grouped[false].to_i
|
||||||
closed_subtasks = subtasks_grouped[true].to_i
|
closed_subtasks = subtasks_grouped[true].to_i
|
||||||
all_subtasks = open_subtasks + closed_subtasks
|
render_issues_stats(open_subtasks, closed_subtasks, {:parent_id => "~#{issue.id}"})
|
||||||
|
end
|
||||||
|
|
||||||
return if all_subtasks == 0
|
# Renders relations stats (total relations (open - closed)) with query links
|
||||||
|
def render_relations_stats(issue, relations)
|
||||||
|
open_relations = relations.count{|r| (r.other_issue(issue).closed?)==false}
|
||||||
|
closed_relations = relations.count{|r| r.other_issue(issue).closed?}
|
||||||
|
render_issues_stats(open_relations, closed_relations, {:issue_id => relations.map{|r| r.other_issue(issue).id}.join(',')})
|
||||||
|
end
|
||||||
|
|
||||||
|
# Renders issues stats (total relations (open - closed)) with query links
|
||||||
|
def render_issues_stats(open_issues=0, closed_issues=0, issues_path_attr={})
|
||||||
|
total_issues = open_issues + closed_issues
|
||||||
|
return if total_issues == 0
|
||||||
|
|
||||||
all_block = content_tag(
|
all_block = content_tag(
|
||||||
'span',
|
'span',
|
||||||
link_to(all_subtasks, issues_path(parent_id: "~#{issue.id}", set_filter: true, status_id: '*')),
|
link_to(total_issues, issues_path(issues_path_attr.merge({:set_filter => true, :status_id => '*'}))),
|
||||||
class: 'badge badge-issues-count'
|
class: 'badge badge-issues-count'
|
||||||
)
|
)
|
||||||
|
|
||||||
closed_block = content_tag(
|
closed_block = content_tag(
|
||||||
'span',
|
'span',
|
||||||
link_to_if(
|
link_to_if(
|
||||||
closed_subtasks > 0,
|
closed_issues > 0,
|
||||||
l(:label_x_closed_issues_abbr, count: closed_subtasks),
|
l(:label_x_closed_issues_abbr, count: closed_issues),
|
||||||
issues_path(parent_id: "~#{issue.id}", set_filter: true, status_id: 'c')
|
issues_path(issues_path_attr.merge({:set_filter => true, :status_id => 'c'}))
|
||||||
),
|
),
|
||||||
class: 'closed'
|
class: 'closed'
|
||||||
)
|
)
|
||||||
|
|
||||||
open_block = content_tag(
|
open_block = content_tag(
|
||||||
'span',
|
'span',
|
||||||
link_to_if(
|
link_to_if(
|
||||||
open_subtasks > 0,
|
open_issues > 0,
|
||||||
l(:label_x_open_issues_abbr, :count => open_subtasks),
|
l(:label_x_open_issues_abbr, :count => open_issues),
|
||||||
issues_path(:parent_id => "~#{issue.id}", :set_filter => true, :status_id => 'o')
|
issues_path(issues_path_attr.merge({:set_filter => true, :status_id => 'o'}))
|
||||||
),
|
),
|
||||||
class: 'open'
|
class: 'open'
|
||||||
)
|
)
|
||||||
|
|
||||||
content_tag(
|
content_tag(
|
||||||
'span',
|
'span',
|
||||||
"#{all_block} (#{open_block} — #{closed_block})".html_safe,
|
"#{all_block} (#{open_block} — #{closed_block})".html_safe,
|
||||||
|
|||||||
@@ -4,7 +4,10 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p><strong><%=l(:label_related_issues)%></strong></p>
|
<p>
|
||||||
|
<strong><%=l(:label_related_issues)%></strong>
|
||||||
|
<%= render_relations_stats(@issue, @relations) if @relations.present? %>
|
||||||
|
</p>
|
||||||
|
|
||||||
<% if @relations.present? %>
|
<% if @relations.present? %>
|
||||||
<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %>
|
<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %>
|
||||||
|
|||||||
@@ -550,8 +550,8 @@ body.controller-issues h2.inline-flex {padding-right: 0}
|
|||||||
#issue_tree td.checkbox, #relations td.checkbox {display:none;}
|
#issue_tree td.checkbox, #relations td.checkbox {display:none;}
|
||||||
#issue_tree td.subject, #relations td.subject {width: 50%;}
|
#issue_tree td.subject, #relations td.subject {width: 50%;}
|
||||||
#issue_tree td.buttons, #relations td.buttons {padding:0;}
|
#issue_tree td.buttons, #relations td.buttons {padding:0;}
|
||||||
#issue_tree .issues-stat {font-size: 80%}
|
#issue_tree .issues-stat, #relations .issues-stat {font-size: 80%}
|
||||||
#issue_tree .issues-stat .badge {bottom: initial;}
|
#issue_tree .issues-stat .badge, #relations .issues-stat .badge {bottom: initial;}
|
||||||
|
|
||||||
#trackers_description {display:none;}
|
#trackers_description {display:none;}
|
||||||
#trackers_description dt {font-weight: bold; text-decoration: underline;}
|
#trackers_description dt {font-weight: bold; text-decoration: underline;}
|
||||||
|
|||||||
@@ -397,4 +397,42 @@ class IssuesHelperTest < Redmine::HelperTest
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_render_issues_stats
|
||||||
|
html = render_issues_stats(1, 1, {:issue_id => '15,16'})
|
||||||
|
|
||||||
|
assert_include '<a href="/issues?issue_id=15%2C16&set_filter=true&status_id=%2A">2</a>', html
|
||||||
|
assert_include '<a href="/issues?issue_id=15%2C16&set_filter=true&status_id=o">1 open</a>', html
|
||||||
|
assert_include '<a href="/issues?issue_id=15%2C16&set_filter=true&status_id=c">1 closed</a>', html
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_descendants_stats
|
||||||
|
parent = Issue.generate!(:status_id => 1)
|
||||||
|
child = Issue.generate!(:parent_issue_id => parent.id, :status_id => 1)
|
||||||
|
Issue.generate!(:parent_issue_id => child.id, :status_id => 5)
|
||||||
|
parent.reload
|
||||||
|
html = render_descendants_stats(parent)
|
||||||
|
|
||||||
|
assert_include "<a href=\"/issues?parent_id=~#{parent.id}&set_filter=true&status_id=%2A\">2</a>", html
|
||||||
|
assert_include "<a href=\"/issues?parent_id=~#{parent.id}&set_filter=true&status_id=o\">1 open</a>", html
|
||||||
|
assert_include "<a href=\"/issues?parent_id=~#{parent.id}&set_filter=true&status_id=c\">1 closed</a>", html
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_relations_stats
|
||||||
|
issue = Issue.generate!(:status_id => 1)
|
||||||
|
relations = []
|
||||||
|
open_issue = Issue.generate!(:status_id => 1)
|
||||||
|
relations << IssueRelation.create!(:issue_from => open_issue,
|
||||||
|
:issue_to => issue,
|
||||||
|
:relation_type => IssueRelation::TYPE_RELATES)
|
||||||
|
closed_issue = Issue.generate!(:status_id => 5)
|
||||||
|
relations << IssueRelation.create!(:issue_from => closed_issue,
|
||||||
|
:issue_to => issue,
|
||||||
|
:relation_type => IssueRelation::TYPE_FOLLOWS)
|
||||||
|
html = render_relations_stats(issue, relations)
|
||||||
|
|
||||||
|
assert_include "<a href=\"/issues?issue_id=#{open_issue.id}%2C#{closed_issue.id}&set_filter=true&status_id=%2A\">2</a></span>", html
|
||||||
|
assert_include "<a href=\"/issues?issue_id=#{open_issue.id}%2C#{closed_issue.id}&set_filter=true&status_id=o\">1 open</a>", html
|
||||||
|
assert_include "<a href=\"/issues?issue_id=#{open_issue.id}%2C#{closed_issue.id}&set_filter=true&status_id=c\">1 closed</a>", html
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user