summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/helpers/custom_fields_helper.rb11
-rw-r--r--lib/redmine/field_format.rb6
-rw-r--r--test/unit/helpers/custom_fields_helper_test.rb30
3 files changed, 41 insertions, 6 deletions
diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb
index 3f357ab0c..617a6123d 100644
--- a/app/helpers/custom_fields_helper.rb
+++ b/app/helpers/custom_fields_helper.rb
@@ -96,16 +96,23 @@ module CustomFieldsHelper
# Return custom field label tag
def custom_field_label_tag(name, custom_value, options={})
required = options[:required] || custom_value.custom_field.is_required?
+ for_tag_id = options.fetch(:for_tag_id, "#{name}_custom_field_values_#{custom_value.custom_field.id}")
content = custom_field_name_tag custom_value.custom_field
content_tag "label", content +
(required ? " <span class=\"required\">*</span>".html_safe : ""),
- :for => "#{name}_custom_field_values_#{custom_value.custom_field.id}"
+ :for => for_tag_id
end
# Return custom field tag with its label tag
def custom_field_tag_with_label(name, custom_value, options={})
- custom_field_label_tag(name, custom_value, options) + custom_field_tag(name, custom_value)
+ tag = custom_field_tag(name, custom_value)
+ tag_id = nil
+ ids = tag.scan(/ id="(.+?)"/)
+ if ids.size == 1
+ tag_id = ids.first.first
+ end
+ custom_field_label_tag(name, custom_value, options.merge(:for_tag_id => tag_id)) + tag
end
# Returns the custom field tag for when bulk editing objects
diff --git a/lib/redmine/field_format.rb b/lib/redmine/field_format.rb
index c59ca730e..6bd98e3ac 100644
--- a/lib/redmine/field_format.rb
+++ b/lib/redmine/field_format.rb
@@ -558,13 +558,11 @@ module Redmine
opts.each do |label, value|
value ||= label
checked = (custom_value.value.is_a?(Array) && custom_value.value.include?(value)) || custom_value.value.to_s == value
- tag = view.send(tag_method, tag_name, value, checked, :id => tag_id)
- # set the id on the first tag only
- tag_id = nil
+ tag = view.send(tag_method, tag_name, value, checked, :id => nil)
s << view.content_tag('label', tag + ' ' + label)
end
if custom_value.custom_field.multiple?
- s << view.hidden_field_tag(tag_name, '')
+ s << view.hidden_field_tag(tag_name, '', :id => nil)
end
css = "#{options[:class]} check_box_group"
view.content_tag('span', s, options.merge(:class => css))
diff --git a/test/unit/helpers/custom_fields_helper_test.rb b/test/unit/helpers/custom_fields_helper_test.rb
index 5ee500f3e..c27137c20 100644
--- a/test/unit/helpers/custom_fields_helper_test.rb
+++ b/test/unit/helpers/custom_fields_helper_test.rb
@@ -41,6 +41,36 @@ class CustomFieldsHelperTest < ActionView::TestCase
assert_select_in tag, 'label span[title]', 0
end
+ def test_label_tag_should_include_for_attribute_for_select_tag
+ field = CustomField.new(:name => 'Foo', :field_format => 'list')
+ s = custom_field_tag_with_label('foo', CustomValue.new(:custom_field => field))
+ assert_select_in s, 'label[for]'
+ end
+
+ def test_label_tag_should_not_include_for_attribute_for_checkboxes
+ field = CustomField.new(:name => 'Foo', :field_format => 'list', :edit_tag_style => 'check_box')
+ s = custom_field_tag_with_label('foo', CustomValue.new(:custom_field => field))
+ assert_select_in s, 'label:not([for])'
+ end
+
+ def test_label_tag_should_include_for_attribute_for_bool_as_select_tag
+ field = CustomField.new(:name => 'Foo', :field_format => 'bool')
+ s = custom_field_tag_with_label('foo', CustomValue.new(:custom_field => field))
+ assert_select_in s, 'label[for]'
+ end
+
+ def test_label_tag_should_include_for_attribute_for_bool_as_checkbox
+ field = CustomField.new(:name => 'Foo', :field_format => 'bool', :edit_tag_style => 'check_box')
+ s = custom_field_tag_with_label('foo', CustomValue.new(:custom_field => field))
+ assert_select_in s, 'label[for]'
+ end
+
+ def test_label_tag_should_not_include_for_attribute_for_bool_as_radio
+ field = CustomField.new(:name => 'Foo', :field_format => 'bool', :edit_tag_style => 'radio')
+ s = custom_field_tag_with_label('foo', CustomValue.new(:custom_field => field))
+ assert_select_in s, 'label:not([for])'
+ end
+
def test_unknow_field_format_should_be_edited_as_string
field = CustomField.new(:field_format => 'foo')
value = CustomValue.new(:value => 'bar', :custom_field => field)