module ExpressTemplates module Components module Forms class Radio < FormComponent include OptionSupport has_option :options, 'Supplies a list of options for the radio tag' has_option :label_wrapper_class, 'Specify a class for labels which wrap each radio option.' has_option( :label_after, "Specify (true of false) if the label should appear after the input (they will be siblings)", default: false ) contains -> { label_tag(label_name, label_text) if option_values_specified? generate_options_from_specified_values else use_options_from_collection_radio_buttons_helper end } def use_options_from_collection_radio_buttons_helper collection_radio_buttons(resource_name, field_name.to_sym, collection_from_association, option_value_method, option_name_method, input_attributes) do |b| b.label(class: "radio") { b.radio_button + b.text } end end def option_values_specified? [Array, Hash].include?(option_collection.class) end def option_collection config[:options] end def generate_options_from_specified_values if !option_collection.kind_of?(Array) && !option_collection.kind_of?(Hash) raise ArgumentError, "Radio collection should be Array or Hash: #{option_collection.inspect}" end option_collection_hash = option_collection if option_collection.kind_of?(Array) option_collection_hash = option_collection.inject({}) do |hash, val| hash[val] = val hash end end option_collection_hash.each_pair do |key, value| if label_after? div(class: "radio-input-container") { radio_button(resource_name, field_name.to_sym, key, class: 'radio') label({ class: config[:label_wrapper_class], for: "#{resource_name}_#{field_name}_#{key}", }) { current_arbre_element.add_child value } } else label(class: config[:label_wrapper_class]) { radio_button(resource_name, field_name.to_sym, key, class: 'radio') current_arbre_element.add_child value } end end end def collection_from_association related_collection or raise "No association collection for: #{resource_name}.#{field_name}" end protected def label_after? !!config[:label_after] end end end end end