Sha256: cd5a50874e067cc0e18023d5fde88d66f487a569191dd2d67a521b57fc926f9b

Contents?: true

Size: 1.77 KB

Versions: 3

Compression:

Stored size: 1.77 KB

Contents

module Yaks
  class Mapper
    class Form
      extend Configurable, Forwardable, Util

      ConfigBuilder = Builder.new(Config) do
        def_set :action, :title, :method, :media_type
        def_add :field, create: Field::Builder, append_to: :fields
        def_add :fieldset, create: Fieldset, append_to: :fields
        HTML5Forms::INPUT_TYPES.each do |type|
          def_add(type,
            create: Field::Builder,
            append_to: :fields,
            defaults: { type: type }
          )
        end
        def_forward :dynamic
      end

      def_delegators :config, :name, :action, :title, :method,
                              :media_type, :fields, :dynamic_blocks

      def self.create(*args, &block)
        args, options = extract_options(args)

        if args.first.is_a? Symbol
          options[:name] = args.first
        end

        new(ConfigBuilder.build(Config.new(options), &block))
      end

      ############################################################
      # instance

      include Concord.new(:config)

      def add_to_resource(resource, mapper, _context)
        resource.add_form(to_resource(mapper))
      end

      private

      def to_resource(mapper)
        config = dynamic_blocks.inject(self.config) do |config, block|
          ConfigBuilder.build(config, mapper.object, &block)
        end

        attrs = {
          fields: resource_fields(config.fields, mapper),
          action: mapper.expand_uri(config.action, true)
        }

        [:name, :title, :method, :media_type].each do |attr|
          attrs[attr] = mapper.expand_value(config.public_send(attr))
        end

        Resource::Form.new(attrs)
      end

      def resource_fields(fields, mapper)
        fields.map { |field| field.to_resource(mapper) }
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
yaks-0.8.0.beta2 lib/yaks/mapper/form.rb
yaks-0.8.0.beta1 lib/yaks/mapper/form.rb
yaks-0.8.0.alpha lib/yaks/mapper/form.rb