]> source.dussan.org Git - redmine.git/commitdiff
Fixed rendering of multivalued custom fields in the issue history (#19225).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 8 Mar 2015 09:07:20 +0000 (09:07 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 8 Mar 2015 09:07:20 +0000 (09:07 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@14054 e93f8b46-1217-0410-a6f0-8f06a7374b81

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

index 3870a066df44b16a2d76d9f762e949dd37a2f28e..8e951596cc105bddfb95fa63fdc5129ca82e22a1 100644 (file)
@@ -320,15 +320,19 @@ module IssuesHelper
       end
       strings << show_detail(detail, no_html, options)
     end
-    values_by_field.each do |field, changes|
-      detail = JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s)
-      detail.instance_variable_set "@custom_field", field
-      if changes[:added].any?
-        detail.value = changes[:added]
-        strings << show_detail(detail, no_html, options)
-      elsif changes[:deleted].any?
-        detail.old_value = changes[:deleted]
-        strings << show_detail(detail, no_html, options)
+    if values_by_field.present?
+      multiple_values_detail = Struct.new(:property, :prop_key, :custom_field, :old_value, :value)
+      values_by_field.each do |field, changes|
+        if changes[:added].any?
+          detail = multiple_values_detail.new('cf', field.id.to_s, field)
+          detail.value = changes[:added]
+          strings << show_detail(detail, no_html, options)
+        end
+        if changes[:deleted].any?
+          detail = multiple_values_detail.new('cf', field.id.to_s, field)
+          detail.old_value = changes[:deleted]
+          strings << show_detail(detail, no_html, options)
+        end
       end
     end
     strings
index b275e75db8db22f1f57dfb09a04901acc3b34fdd..7e9ec0e0982ae6e5f2d3069593508c4ff7e8ceb9 100644 (file)
@@ -296,6 +296,43 @@ class IssuesHelperTest < ActionView::TestCase
     assert_equal "<strong>Precedes</strong> deleted (<i>Issue ##{issue.id}</i>)", show_detail(detail, false)
   end
 
+  def test_details_to_strings_with_multiple_values_removed_from_custom_field
+    field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true)
+    details = []
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '1', :value => nil)
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '3', :value => nil)
+
+    assert_equal ["User deleted (Dave Lopper, Redmine Admin)"], details_to_strings(details, true)
+    assert_equal ["<strong>User</strong> deleted (<del><i>Dave Lopper, Redmine Admin</i></del>)"], details_to_strings(details, false)
+  end
+
+  def test_details_to_strings_with_multiple_values_added_to_custom_field
+    field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true)
+    details = []
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '1')
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '3')
+
+    assert_equal ["User Dave Lopper, Redmine Admin added"], details_to_strings(details, true)
+    assert_equal ["<strong>User</strong> <i>Dave Lopper, Redmine Admin</i> added"], details_to_strings(details, false)
+  end
+
+  def test_details_to_strings_with_multiple_values_added_and_removed_from_custom_field
+    field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true)
+    details = []
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '1')
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '2', :value => nil)
+    details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '3', :value => nil)
+
+    assert_equal [
+      "User Redmine Admin added",
+      "User deleted (Dave Lopper, John Smith)"
+      ], details_to_strings(details, true)
+    assert_equal [
+      "<strong>User</strong> <i>Redmine Admin</i> added",
+      "<strong>User</strong> deleted (<del><i>Dave Lopper, John Smith</i></del>)"
+      ], details_to_strings(details, false)
+  end
+
   def test_find_name_by_reflection_should_return_nil_for_missing_record
     assert_nil find_name_by_reflection('status', 99)
   end