Sha256: 9d995019f900b44a4f64ab1cdb05f7e1cbd9773f691938b59884ae99916586f7

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module Phlexi
  module Form
    module Structure
      class FieldCollection
        include Enumerable

        class Builder
          attr_reader :key, :index

          def initialize(key, field, index)
            @key = key.to_s
            @field = field
            @index = index
          end

          def field(**)
            @field.class.new(key, input_attributes: @field.input_attributes, **, parent: @field).tap do |field|
              yield field if block_given?
            end
          end

          def hidden_field_tag(value: "", force: false)
            raise "Attempting to build hidden field on non-first field in a collection" unless index == 0 || force

            @field.class
              .new("hidden", parent: @field)
              .input_tag(type: :hidden, value:)
          end
        end

        def initialize(field:, range:, &)
          @field = field
          @range = case range
          when Range, Array
            range
          when Integer
            1..range
          else
            range.to_a
          end
          each(&) if block_given?
        end

        def each(&)
          @range.each.with_index do |key, index|
            yield Builder.new(key, @field, index)
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
phlexi-form-0.3.0.rc1 lib/phlexi/form/structure/field_collection.rb