class ComfortableMexicanSofa::FormBuilder < ActionView::Helpers::FormBuilder
helpers = field_helpers -
%w(hidden_field fields_for) +
%w(select)
helpers.each do |name|
class_eval %Q^
def #{name}(field, *args)
options = args.extract_options!
args << options
return super if options.delete(:disable_builder)
default_field('#{name}', field, options){ super }
end
^
end
def default_field(type, field, options = {}, &block)
errors = if object.respond_to?(:errors) && object.errors[field].present?
"
#{[object.errors[field]].flatten.first}
"
end
if desc = options.delete(:desc)
desc = "#{desc}
"
end
%(
).html_safe
end
def simple_field(label = nil, content = nil, options = {}, &block)
content ||= @template.capture(&block) if block_given?
%(
).html_safe
end
def label_for(field, options={})
label = options.delete(:label) || object.class.human_attribute_name(field).capitalize
for_value = options[:id] || "#{object_name}_#{field}"
%Q{}.html_safe
end
def submit(value, options = {}, &block)
return super if options.delete(:disable_builder)
extra_content = @template.capture(&block) if block_given?
simple_field(nil, "#{super(value, options)} #{extra_content}", :class => 'submit_element')
end
# -- Tag Field Fields -----------------------------------------------------
def default_tag_field(tag, index, options = {})
method = options.delete(:method) || :text_field_tag
label = tag.page.class.human_attribute_name(tag.identifier.to_s)
css_class = tag.class.to_s.demodulize.underscore
content = ''
input_class = case tag
when ComfortableMexicanSofa::Tag::PageDateTime, ComfortableMexicanSofa::Tag::FieldDateTime
'datetime'
when ComfortableMexicanSofa::Tag::PageText, ComfortableMexicanSofa::Tag::FieldText
'code'
when ComfortableMexicanSofa::Tag::PageRichText
'rich_text'
end
case method
when :file_field_tag
input_params = {:id => nil, :class => input_class}
input_params.merge!(:multiple => true) if options[:multiple]
name = "page[blocks_attributes][#{index}][content]"
name << '[]' if options[:multiple]
content << @template.send(method, name, input_params)
content << @template.render(:partial => 'cms_admin/files/page_form', :object => tag.block)
else
content << @template.send(method, "page[blocks_attributes][#{index}][content]", tag.content, :id => nil, :class => input_class)
end
content << @template.hidden_field_tag("page[blocks_attributes][#{index}][identifier]", tag.identifier, :id => nil)
simple_field(label, content, :class => css_class)
end
def field_date_time(tag, index)
default_tag_field(tag, index)
end
def field_integer(tag, index)
default_tag_field(tag, index, :method => :number_field_tag)
end
def field_string(tag, index)
default_tag_field(tag, index)
end
def field_text(tag, index)
default_tag_field(tag, index, :method => :text_area_tag)
end
def page_date_time(tag, index)
default_tag_field(tag, index)
end
def page_integer(tag, index)
default_tag_field(tag, index, :method => :number_field_tag)
end
def page_string(tag, index)
default_tag_field(tag, index)
end
def page_text(tag, index)
default_tag_field(tag, index, :method => :text_area_tag)
end
def page_rich_text(tag, index)
default_tag_field(tag, index, :method => :text_area_tag)
end
def page_file(tag, index)
default_tag_field(tag, index, :method => :file_field_tag)
end
def page_files(tag, index)
default_tag_field(tag, index, :method => :file_field_tag, :multiple => true)
end
def collection(tag, index)
options = [["---- Select #{tag.collection_class.titleize} ----", nil]] +
tag.collection_objects.collect do |m|
[m.send(tag.collection_title), m.send(tag.collection_identifier)]
end
content = @template.select_tag(
"page[blocks_attributes][#{index}][content]",
@template.options_for_select(options, :selected => tag.content),
:id => nil
)
content << @template.hidden_field_tag("page[blocks_attributes][#{index}][identifier]", tag.identifier, :id => nil)
simple_field(tag.identifier.titleize, content, :class => tag.class.to_s.demodulize.underscore )
end
end