Sha256: 52114d3cdd613a0775cb931335a42c072ce2768d3d7d859dbc1064afb36bb74c

Contents?: true

Size: 1.73 KB

Versions: 5

Compression:

Stored size: 1.73 KB

Contents

module Trestle
  class Form
    module Fields
      class Select < Field
        attr_reader :choices, :html_options

        def initialize(builder, template, name, choices=nil, options={}, html_options={}, &block)
          super(builder, template, name, options, &block)

          @choices = choices || default_choices
          @choices = Choices.new(@choices) if @choices.nil? || @choices.is_a?(Enumerable)

          @html_options = default_html_options.merge(html_options)
        end

        def field
          builder.raw_select(name, choices, options, html_options, &block)
        end

        def default_html_options
          Trestle::Options.new(class: ["form-control"], disabled: disabled? || readonly?, data: { enable_select2: true })
        end

        def default_choices
          builder.object.send(name) if builder.object
        end

        # Allows an array of model instances (or a scope) to be
        # passed to the select field as the list of choices.
        class Choices
          include Enumerable
          alias empty? none?

          def initialize(choices)
            @choices = Array(choices)
          end

          def each
            @choices.each do |option|
              yield option_text_and_value(option)
            end
          end

        protected
          def option_text_and_value(option)
            if !option.is_a?(String) && option.respond_to?(:first) && option.respond_to?(:last)
              option
            elsif option.respond_to?(:id)
              [Trestle::Display.new(option).to_s, option.id]
            else
              [option, option]
            end
          end
        end
      end
    end
  end
end

Trestle::Form::Builder.register(:select, Trestle::Form::Fields::Select)

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
trestle-0.9.8 lib/trestle/form/fields/select.rb
trestle-0.9.7 lib/trestle/form/fields/select.rb
trestle-0.9.6 lib/trestle/form/fields/select.rb
trestle-0.9.5 lib/trestle/form/fields/select.rb
trestle-0.9.4 lib/trestle/form/fields/select.rb