codeRIT/hackathon_manager

View on GitHub
app/helpers/manage/bootstrap_form_helper.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Manage
  module BootstrapFormHelper
    def bs_vertical_simple_form(path, options = {}, &block)
      bootstrap_options = {
        wrapper: :bootstrap_vertical_form,
        wrapper_mappings: {
          boolean:       :bootstrap_vertical_boolean,
          check_boxes:   :bootstrap_vertical_collection,
          date:          :bootstrap_vertical_multi_select,
          datetime:      :bootstrap_vertical_multi_select,
          file:          :bootstrap_vertical_file,
          radio_buttons: :bootstrap_vertical_collection,
          range:         :bootstrap_vertical_range,
          time:          :bootstrap_vertical_multi_select
        }
      }
      options = options.deep_merge(bootstrap_options)
      patch_simple_form_config do
        simple_form_for(path, options, &block)
      end
    end

    def bs_horizontal_simple_form_for(path, options = {}, &block)
      bootstrap_options = {
        wrapper: :bootstrap_horizontal_form,
        wrapper_mappings: {
          boolean:       :bootstrap_horizontal_boolean,
          check_boxes:   :bootstrap_horizontal_collection,
          date:          :bootstrap_horizontal_multi_select,
          datetime:      :bootstrap_horizontal_multi_select,
          file:          :bootstrap_horizontal_file,
          radio_buttons: :bootstrap_horizontal_collection,
          range:         :bootstrap_horizontal_range,
          time:          :bootstrap_horizontal_multi_select
        }
      }
      options = options.deep_merge(bootstrap_options)
      patch_simple_form_config do
        simple_form_for(path, options, &block)
      end
    end

    private

    def set_config(key, value)
      @saved_values ||= {}
      @saved_values[key] = SimpleForm.send(key)
      SimpleForm.send("#{key}=", value)
    end

    def restore_config
      @saved_values.keys.each do |key|
        value = @saved_values.delete(key)
        SimpleForm.send("#{key}=", value)
      end
    end

    def patch_simple_form_config
      # Values copied from the top of
      # https://github.com/rafaelfranca/simple_form-bootstrap/blob/master/config/initializers/simple_form_bootstrap.rb

      # Default class for buttons
      set_config(:button_class, 'btn')

      # Define the default class of the input wrapper of the boolean input.
      set_config(:boolean_label_class, 'form-check-label')

      # How the label text should be generated altogether with the required text.
      set_config(:label_text, ->(label, required, _explicit_label) { "#{label} #{required}" })

      # Define the way to render check boxes / radio buttons with labels.
      set_config(:boolean_style, :inline)

      # You can wrap each item in a collection of radio/check boxes with a tag
      set_config(:item_wrapper_tag, :div)

      # Defines if the default input wrapper class should be included in radio
      # collection wrappers.
      set_config(:include_default_input_wrapper_class, false)

      # CSS class to add for error notification helper.
      set_config(:error_notification_class, 'alert alert-danger')

      # Method used to tidy up errors. Specify any Rails Array method.
      # :first lists the first message for each field.
      # :to_sentence to list all errors for each field.
      set_config(:error_method, :to_sentence)

      # add validation classes to `input_field`
      set_config(:input_field_error_class, 'is-invalid')
      # set_config(:input_field_valid_class, 'is-valid')

      yield
    ensure
      restore_config
    end
  end
end