Created
September 14, 2012 16:13
-
-
Save spleenteo/3722944 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module Railsyard::Backend | |
| class FormBuilder < SimpleForm::FormBuilder | |
| def group(group_name, options = {}, &block) | |
| group_legend = template.link_to translate(:groups, group_name, group_name.to_s.titleize), "##{group_name}", data: { behaviour: "dom-toggle" } | |
| group_hint = translate(:group_hints, group_name) | |
| [ | |
| template.content_tag(:h3, group_legend, class: 'group-header', data: { translation_keys: translate_lookups(:groups, group_name, group_name.to_s.titleize) }), | |
| template.content_tag(:div, id: group_name, class: 'group-content') do | |
| [ | |
| (template.content_tag(:p, group_hint, class: "hint") if group_hint.present?), | |
| template.capture(&block) | |
| ].join.html_safe | |
| end | |
| ].join.html_safe | |
| end | |
| def translate_lookups(namespace, name, default='') | |
| model_names = lookup_model_names.dup | |
| lookups = [] | |
| while !model_names.empty? | |
| joined_model_names = model_names.join(".") | |
| model_names.shift | |
| lookups << :"#{joined_model_names}.#{lookup_action}.#{name}" | |
| lookups << :"#{joined_model_names}.#{name}" | |
| end | |
| lookups << :"defaults.#{lookup_action}.#{name}" | |
| lookups << :"defaults.#{name}" | |
| lookups << default | |
| lookups | |
| end | |
| def translate(namespace, name, default='') | |
| lookups = translate_lookups(namespace, name, default) | |
| I18n.t(lookups.shift, :scope => :"railsyard.#{namespace}", :default => lookups).presence | |
| end | |
| def link_to_add(*args, &block) | |
| options = args.extract_options!.symbolize_keys | |
| association = args.pop | |
| complete_association_name = "#{object_name}_#{association}".gsub(/[\[\]]+/, '_') | |
| options[:class] = [options[:class], "add_nested_fields"].compact.join(" ") | |
| options["data-association"] = complete_association_name | |
| options["data-association-type"] = object.class.reflect_on_association(association).macro | |
| args << (options.delete(:href) || "javascript:void(0)") | |
| args << options | |
| @fields ||= {} | |
| @template.after_nested_form(complete_association_name) do | |
| model_object = object.class.reflect_on_association(association).klass.new | |
| output = %Q[<div id="#{complete_association_name}_fields_blueprint" class="nested_form_blueprint" style="display: none">].html_safe | |
| output << fields_for(association, model_object, :child_index => "new_#{complete_association_name}", &@fields[complete_association_name]) | |
| output.safe_concat('</div>') | |
| output | |
| end | |
| @template.link_to(*args, &block) | |
| end | |
| def link_to_remove(*args, &block) | |
| options = args.extract_options!.symbolize_keys | |
| association = args.pop | |
| complete_association_name = "#{parent_builder.object_name}_#{association}".gsub(/[\[\]]+/, '_') | |
| options[:class] = [options[:class], "remove_nested_fields"].compact.join(" ") | |
| options["data-association"] = complete_association_name | |
| options["data-association-type"] = parent_builder.object.class.reflect_on_association(association).macro | |
| args << (options.delete(:href) || "javascript:void(0)") | |
| args << options | |
| hidden_field(:_destroy) + @template.link_to(*args, &block) | |
| end | |
| def fields_for_with_nested_attributes(association_name, *args) | |
| # TODO Test this better | |
| complete_association_name = "#{object_name}_#{association_name}".gsub(/[\[\]]+/, '_') | |
| block = args.pop || Proc.new { |fields| @template.render(:partial => "#{complete_association_name.to_s.singularize}_fields", :locals => {:f => fields}) } | |
| @fields ||= {} | |
| @fields[complete_association_name] = block | |
| super(association_name, *(args << block)) | |
| end | |
| def fields_for_nested_model(name, object, options, block) | |
| output = '<div class="fields">'.html_safe | |
| output << super | |
| output.safe_concat('</div>') | |
| output | |
| end | |
| def error_messages | |
| return unless object.respond_to?(:errors) && object.errors.any? | |
| @template.content_tag(:ul, class: "errors") do | |
| object.errors.full_messages.map do |error| | |
| @template.content_tag(:li, error) | |
| end.join.html_safe | |
| end | |
| end | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment