]> source.dussan.org Git - redmine.git/commitdiff
The descendant count in the issues delete confirmation message is wrong if issues...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 30 Dec 2014 11:24:00 +0000 (11:24 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 30 Dec 2014 11:24:00 +0000 (11:24 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@13818 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/issues_helper.rb
test/unit/helpers/issues_helper_test.rb

index 47f97255273806bc4d6558f666382838815cb9b5..44b8e1be4ef770796159bca78c10becf991c3d7b 100644 (file)
@@ -180,20 +180,20 @@ module IssuesHelper
     s.html_safe
   end
 
+  # Returns the number of descendants for an array of issues
+  def issues_descendant_count(issues)
+    ids = issues.reject(&:leaf?).map {|issue| issue.descendants.ids}.flatten.uniq
+    ids -= issues.map(&:id)
+    ids.size
+  end
+
   def issues_destroy_confirmation_message(issues)
     issues = [issues] unless issues.is_a?(Array)
     message = l(:text_issues_destroy_confirmation)
-    descendant_count = issues.inject(0) {|memo, i| memo += (i.right - i.left - 1)/2}
+
+               descendant_count = issues_descendant_count(issues)
     if descendant_count > 0
-      issues.each do |issue|
-        next if issue.root?
-        issues.each do |other_issue|
-          descendant_count -= 1 if issue.is_descendant_of?(other_issue)
-        end
-      end
-      if descendant_count > 0
-        message << "\n" + l(:text_issues_destroy_descendants_confirmation, :count => descendant_count)
-      end
+      message << "\n" + l(:text_issues_destroy_descendants_confirmation, :count => descendant_count)
     end
     message
   end
index cf681882c1a364ada1efe2452d746449f15c94f7..393533fd368aa8740f1d97f4f8dfeb7fd162c70c 100644 (file)
@@ -68,6 +68,16 @@ class IssuesHelperTest < ActionView::TestCase
                  issues_destroy_confirmation_message(Issue.find([1, 2]))
   end
 
+  def test_issues_destroy_confirmation_message_with_issues_that_share_descendants
+    root = Issue.generate!
+    child = Issue.generate!(:parent_issue_id => root.id)
+    Issue.generate!(:parent_issue_id => child.id)
+
+    assert_equal l(:text_issues_destroy_confirmation) + "\n" +
+                   l(:text_issues_destroy_descendants_confirmation, :count => 1),
+                 issues_destroy_confirmation_message([root.reload, child.reload])
+  end
+
   test 'show_detail with no_html should show a changing attribute' do
     detail = JournalDetail.new(:property => 'attr', :old_value => '40',
                                :value => '100', :prop_key => 'done_ratio')