Chris@909: # encoding: utf-8 Chris@909: # Chris@441: # Redmine - project management software Chris@1494: # Copyright (C) 2006-2014 Jean-Philippe Lang Chris@0: # Chris@0: # This program is free software; you can redistribute it and/or Chris@0: # modify it under the terms of the GNU General Public License Chris@0: # as published by the Free Software Foundation; either version 2 Chris@0: # of the License, or (at your option) any later version. Chris@909: # Chris@0: # This program is distributed in the hope that it will be useful, Chris@0: # but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: # GNU General Public License for more details. Chris@909: # Chris@0: # You should have received a copy of the GNU General Public License Chris@0: # along with this program; if not, write to the Free Software Chris@0: # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Chris@0: Chris@0: module CustomFieldsHelper Chris@0: Chris@1464: CUSTOM_FIELDS_TABS = [ Chris@1464: {:name => 'IssueCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_issue_plural}, Chris@1464: {:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_spent_time}, Chris@1464: {:name => 'ProjectCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_project_plural}, Chris@1464: {:name => 'VersionCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_version_plural}, Chris@1464: {:name => 'UserCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_user_plural}, Chris@1464: {:name => 'GroupCustomField', :partial => 'custom_fields/index', Chris@1464: :label => :label_group_plural}, Chris@1464: {:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', Chris@1464: :label => TimeEntryActivity::OptionName}, Chris@1464: {:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', Chris@1464: :label => IssuePriority::OptionName}, Chris@1464: {:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', Chris@1464: :label => DocumentCategory::OptionName} Chris@1464: ] Chris@1464: Chris@1517: def render_custom_fields_tabs(types) Chris@1517: tabs = CUSTOM_FIELDS_TABS.select {|h| types.include?(h[:name]) } Chris@1517: render_tabs tabs Chris@1517: end Chris@1517: Chris@1517: def custom_field_type_options Chris@1517: CUSTOM_FIELDS_TABS.map {|h| [l(h[:label]), h[:name]]} Chris@1517: end Chris@1517: Chris@1517: def render_custom_field_format_partial(form, custom_field) Chris@1517: partial = custom_field.format.form_partial Chris@1517: if partial Chris@1517: render :partial => custom_field.format.form_partial, :locals => {:f => form, :custom_field => custom_field} Chris@1517: end Chris@1517: end Chris@1517: Chris@1517: def custom_field_tag_name(prefix, custom_field) Chris@1517: name = "#{prefix}[custom_field_values][#{custom_field.id}]" Chris@1517: name << "[]" if custom_field.multiple? Chris@1517: name Chris@1517: end Chris@1517: Chris@1517: def custom_field_tag_id(prefix, custom_field) Chris@1517: "#{prefix}_custom_field_values_#{custom_field.id}" Chris@0: end Chris@909: Chris@0: # Return custom field html tag corresponding to its format Chris@1517: def custom_field_tag(prefix, custom_value) Chris@1517: custom_value.custom_field.format.edit_tag self, Chris@1517: custom_field_tag_id(prefix, custom_value.custom_field), Chris@1517: custom_field_tag_name(prefix, custom_value.custom_field), Chris@1517: custom_value, Chris@1517: :class => "#{custom_value.custom_field.field_format}_cf" Chris@0: end Chris@909: Chris@0: # Return custom field label tag Chris@1115: def custom_field_label_tag(name, custom_value, options={}) Chris@1115: required = options[:required] || custom_value.custom_field.is_required? Chris@1517: title = custom_value.custom_field.description.presence Chris@1517: content = content_tag 'span', custom_value.custom_field.name, :title => title Chris@1115: Chris@1517: content_tag "label", content + Chris@1115: (required ? " *".html_safe : ""), Chris@1115: :for => "#{name}_custom_field_values_#{custom_value.custom_field.id}" Chris@0: end Chris@909: Chris@0: # Return custom field tag with its label tag Chris@1115: def custom_field_tag_with_label(name, custom_value, options={}) Chris@1115: custom_field_label_tag(name, custom_value, options) + custom_field_tag(name, custom_value) Chris@0: end Chris@909: Chris@1517: # Returns the custom field tag for when bulk editing objects Chris@1517: def custom_field_tag_for_bulk_edit(prefix, custom_field, objects=nil, value='') Chris@1517: custom_field.format.bulk_edit_tag self, Chris@1517: custom_field_tag_id(prefix, custom_field), Chris@1517: custom_field_tag_name(prefix, custom_field), Chris@1517: custom_field, Chris@1517: objects, Chris@1517: value, Chris@1517: :class => "#{custom_field.field_format}_cf" Chris@0: end Chris@0: Chris@0: # Return a string used to display a custom value Chris@1517: def show_value(custom_value, html=true) Chris@1517: format_object(custom_value, html) Chris@0: end Chris@909: Chris@0: # Return a string used to display a custom value Chris@1517: def format_value(value, custom_field) Chris@1517: format_object(custom_field.format.formatted_value(self, custom_field, value, false), false) Chris@0: end Chris@0: Chris@0: # Return an array of custom field formats which can be used in select_tag Chris@441: def custom_field_formats_for_select(custom_field) Chris@1517: Redmine::FieldFormat.as_select(custom_field.class.customized_class.name) Chris@0: end Chris@909: Chris@119: # Renders the custom_values in api views Chris@119: def render_api_custom_values(custom_values, api) Chris@119: api.array :custom_fields do Chris@119: custom_values.each do |custom_value| Chris@1115: attrs = {:id => custom_value.custom_field_id, :name => custom_value.custom_field.name} Chris@1115: attrs.merge!(:multiple => true) if custom_value.custom_field.multiple? Chris@1115: api.custom_field attrs do Chris@1115: if custom_value.value.is_a?(Array) Chris@1115: api.array :value do Chris@1115: custom_value.value.each do |value| Chris@1115: api.value value unless value.blank? Chris@1115: end Chris@1115: end Chris@1115: else Chris@1115: api.value custom_value.value Chris@1115: end Chris@119: end Chris@119: end Chris@119: end unless custom_values.empty? Chris@119: end Chris@1517: Chris@1517: def edit_tag_style_tag(form, options={}) Chris@1517: select_options = [[l(:label_drop_down_list), ''], [l(:label_checkboxes), 'check_box']] Chris@1517: if options[:include_radio] Chris@1517: select_options << [l(:label_radio_buttons), 'radio'] Chris@1517: end Chris@1517: form.select :edit_tag_style, select_options, :label => :label_display Chris@1517: end Chris@0: end