-
-module Pettanr
- class FormManager
- class Form
- class Field
- class Text
- def initialize conf, field
- @conf = conf
- @field = field
- end
-
- def tag_options
- opt = @field.tag_options.merge(@conf['options'] || {})
- @field.element.field_tag_attributes(@field.column, @field.mounted, opt)
- end
-
- def render view
- view.text_field_tag @field.tag_name, @field.tag_value, self.tag_options
- end
-
- end
-
- class TextArea < Text
- def render view
- view.text_area_tag @field.tag_name, @field.tag_value, self.tag_options
- end
-
- end
-
- class Number < Text
- def render view
- view.number_field_tag @field.tag_name, @field.tag_value, self.tag_options
- end
-
- end
-
- class Hidden < Text
- def render view
- view.hidden_field_tag @field.tag_name, @field.tag_value, self.tag_options
- end
-
- end
-
- class Select < Text
- def initialize conf, field
- super
- @model = Pettanr::Application::manifest.model(@field.model_name)
- @source_conf = @model.attributes[@field.column]['source']
- end
-
- def items
- Pettanr::Application::manifest.select_items[@source_conf['type']][@source_conf['key']]
- end
-
- def render view
- view.select_tag @field.tag_name,
- view.options_for_select(view.t_select_items(self.items), @field.tag_value), self.tag_options
- end
-
- end
-
- class Helper
- attr :field
- def initialize field, name, conf
- @conf = conf
- @field = field
- @name = name
- end
-
- def wrapper
- @conf['wrapper']
- end
-
- def path
- @conf['path']
- end
-
- def options
- @conf['options']
- end
-
- end
-
- attr :part, :column, :type, :mounted, :model_name, :tag_options, :helpers, :form
- @@type = {
- 'text' => Text, 'text_area' => TextArea, 'number' => Number,
- 'hidden' => Hidden, 'select' => Select
- }
- def initialize form, mounted, conf, manifest
- @form = form
- @mounted = mounted
- @conf = conf
- @manifest = manifest
-
- @model_name = @conf['model'] || @form.model_name
- @part = @conf['part']
- @column = @conf['column']
- @label_conf = @conf['label'] || {}
- @field_conf = @conf['field']
- @helper_confs = @conf['helpers'] || {}
-
- @tag_options = {'data-model' => @model_name}
-
- @model_manifest = Pettanr::Application::manifest.model(@model_name)
- model_attribute_conf = @model_manifest.attributes[self.column] || {}
- @primary_key = model_attribute_conf['primary_key']
-
- @helpers = @helper_confs.map do |helper_name, helper_conf|
- Helper.new self, helper_name, helper_conf
- end
- end
-
- def element
- @element ||= if self.part?
- @form.element.__send__ self.part
- else
- @form.element
- end
- end
-
- def part?
- self.part != nil
- end
-
- def ignore_field?
- @primary_key and self.element.new_record?
- end
-
- def label?
- @label_conf['type'] == nil or @label_conf['type'] != 'hidden'
- end
-
- def label view
- view.t 'activerecord.attributes.' + self.model_name + '.' + self.column
- end
-
- def label_break?
- @label_conf['row_break'] == true
- end
-
- def tag_name
- if self.part?
- @form.model_name + '[' + self.model_name + '_attributes][' + self.column + ']'
- else
- @form.model_name + '[' + self.column + ']'
- end
- end
-
- def tag_value
- self.element.attributes[self.column]
- end
-
- def field
- @field ||= @@type[@field_conf['type']].new @field_conf, self
- end
-
- def has_helper?
- !@helpers.empty?
- end
-
- def row_break?
- @conf['row_break'] == true
- end
-
- end
-
- attr :element, :mounted, :attributes, :fields, :model_name
- def initialize element, operators, mounted, manifest
- @element = element
- @manifest = manifest
- @mounted = mounted
-
- @base = @manifest.base
- @model_name = @base || element.model_name
-
- base_field_confs = if @base
- base_form = Pettanr::Application::manifest.form_managers[@base]
- base_form.fields
- else
- {}
- end
- extend_field_confs = @manifest.fields
- @field_confs = base_field_confs.merge(extend_field_confs)
- @fields = @manifest.field_names.map do |field_name|
- field_conf = @field_confs[field_name]
- Field.new self, @mounted, field_conf, manifest
- end
- end
-
- def name
- @element.form_name
- end
-
- def each_field
- @fields.each do |field|
- next if field.ignore_field?
- yield field
- end
- end
-
+require_dependency "manifest/form/field"
+module Manifest
+ class Form
+ include FormModule
+
+ def self.base_manager manifest, my_manifests
+ form = {}
+ base = my_manifests['base'] || {}
+ base.each {|form_name, form_manifest|
+ form[form_name] = Form.new(manifest, form_name, form_manifest)
+ }
+ form
+ end
+
+ def self.extend_manager manifest, my_manifests
+ form = {}
+ extend = my_manifests['extend'] || {}
+ extend.each {|form_name, form_manifest|
+ form[form_name] = ExtendForm.new(manifest, form_name, form_manifest)
+ }
+ form
end
- attr :form_manifest, :item_name, :manifest, :form_conf
- def initialize form_manifest
+ attr :form_manifest, :form_name, :manifest,
+ :fields, :field_names
+ def initialize manifest, form_name, form_manifest
+ @manifest = manifest
+ @form_name = form_name
@form_manifest = form_manifest
- @item_name = @form_manifest.item_name
- @manifest = @form_manifest.manifest
- @form_conf = @form_manifest.conf
-
+ self.set_default
+ self.init
+ end
+
+ def set_default
+ @form_manifest['fields'] ||= {}
+ @form_manifest['field_names'] ||= []
+ end
+
+ def init
+ @base = @form_manifest['base']
+ @fields = {}
+ @form_manifest['fields'].each {|field_name, field_manifest|
+ @fields[field_name] = FieldFactory.factory(self, field_name, field_manifest)
+ }
+ @field_names = @form_manifest['field_names']
+ end
+
+ def each_field
+ @field_names.each do |field_name|
+ yield field_name, @fields[field_name]
+ end
+ end
+
+ end
+
+ class ExtendForm < Form
+
+ attr :base
+ def set_default
+ super
+ raise "undefined base for forms > extend > #{self.form_name}\n" unless @form_manifest['base']
end
- def open element, operators, mounted
- Form.new element, operators, mounted, @form_manifest
+ def init
+ super
+ @base = @form_manifest['base']
+ @base_form = @manifest.forms[@base]
+ raise "undefined base form for forms > extend > #{self.form_name}\n" unless @base_form
+ @fields.merge! @base_form.fields
end
end
+
end