require 'action_view'
require 'action_view/helpers/tag_helper'
require 'action_view/helpers/form_helper'
module FormLabelHelper
class Base
@@field_error_proc = Proc.new{ |html_tag, instance, css_class| "
#{html_tag}
" }
cattr_accessor :field_error_proc
end
module Helpers
module TagHelper
def label_tag(str, options = {})
options[:accesskey].upcase! if options[:accesskey]
""
end
end
module FormHelper
def label_for(object_name, method, options = {})
options.merge!(:accesskey => get_first_available_accesskey(options[:text] || method.to_s)) unless options[:skip_auto_accesskey]
options.delete(:skip_auto_accesskey)
InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_label_tag(options)
end
private
def get_first_available_accesskey(method)
@accesskey_list ||= []
ref_method = method.to_s.gsub(/\s/, '')
@accesskey_list << ref_method.first.upcase and return ref_method.first.upcase if !@accesskey_list.include?(ref_method.first.upcase)
return get_first_available_accesskey(ref_method[1..ref_method.size])
end
end
class InstanceTag < ActionView::Helpers::InstanceTag #:nodoc:
include FormLabelHelper::Helpers::TagHelper
# alias_method :label_without_error_wrapping, :to_label_tag
def to_label_tag(options)
if object.respond_to?("errors") && object.errors.respond_to?("on")
error_wrapping(to_label_without_error_wrapping(options), object.errors.on(@method_name), "labelWithError")
else
to_label_without_error_wrapping(options)
end
end
def error_wrapping(html_tag, has_error, css_class = nil)
has_error ? Base.field_error_proc.call(html_tag, self, css_class) : html_tag
end
def to_label_without_error_wrapping(options)
ref_options = {}
add_default_name_and_id(ref_options)
options[:for] ||= ref_options["id"]
label_tag(options[:text] ? options.delete(:text) : method_name.humanize, options)
end
end
module FormBuilder
def label(method, options = {})
@template.label_for(@object_name, method, options.merge(:object => @object))
end
end
end
end