heartcombo--simple_form/lib/simple_form/wrappers/many.rb

70 lines
2.1 KiB
Ruby
Raw Normal View History

2011-09-02 18:33:03 +00:00
module SimpleForm
module Wrappers
2011-09-03 07:15:47 +00:00
# A wrapper is an object that holds several components and render them.
# A component may either be a symbol or any object that responds to `render`.
# This API allows inputs/components to be easily wrapped, removing the
# need to modify the code only to wrap input in an extra tag.
#
# `Many` represents a wrapper around several components at the same time.
# It may optionally receive a namespace, allowing it to be configured
# on demand on input generation.
2011-09-02 18:33:03 +00:00
class Many
attr_reader :namespace, :defaults, :components
2011-09-03 07:04:16 +00:00
alias :to_sym :namespace
2011-09-02 18:33:03 +00:00
2011-09-03 07:08:36 +00:00
def initialize(namespace, components, defaults={})
2011-09-02 18:33:03 +00:00
@namespace = namespace
2011-09-03 07:08:36 +00:00
@components = components
@defaults = defaults
2012-02-18 14:47:02 +00:00
@defaults[:tag] = :div unless @defaults.key?(:tag)
@defaults[:class] = Array.wrap(@defaults[:class])
2011-09-02 18:33:03 +00:00
end
def render(input)
2011-09-02 18:33:03 +00:00
content = "".html_safe
options = input.options
components.each do |component|
next if options[component] == false
2011-09-03 07:04:16 +00:00
rendered = component.respond_to?(:render) ? component.render(input) : input.send(component)
2011-09-02 18:33:03 +00:00
content.safe_concat rendered.to_s if rendered
end
wrap(input, options, content)
end
2011-09-03 10:24:47 +00:00
def find(name)
return self if namespace == name
@components.each do |c|
if c.is_a?(Symbol)
return nil if c == namespace
elsif value = c.find(name)
return value
end
end
nil
end
2011-09-02 18:33:03 +00:00
private
def wrap(input, options, content)
2011-09-03 07:15:47 +00:00
return content if options[namespace] == false
2011-09-03 07:08:36 +00:00
tag = (namespace && options[:"#{namespace}_tag"]) || @defaults[:tag]
2011-09-02 18:33:03 +00:00
return content unless tag
klass = html_classes(input, options)
2011-09-02 18:33:03 +00:00
opts = options[:"#{namespace}_html"] || {}
opts[:class] = (klass << opts[:class]).join(' ').strip unless klass.empty?
2011-09-02 18:33:03 +00:00
input.template.content_tag(tag, content, opts)
end
def html_classes(input, options)
@defaults[:class].dup
end
2011-09-02 18:33:03 +00:00
end
end
2011-09-11 21:46:47 +00:00
end