OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / lib / manifest / local / view / form / form.rb
1 require_dependency "manifest/form/field"
2 module Manifest
3   class Form
4     
5     include ProfilerModule
6     def self.manager manifest, my_manifests
7       my_manifests.map {|item_name, form_manifest|
8         self.new(manifest, item_name, form_manifest)
9       }
10     end
11     
12     attr :form_manifest, :item_name, :manifest, 
13       :base, :fields, :field_names
14     def initialize manifest, item_name, form_manifest
15       @manifest = manifest
16       @item_name = item_name
17       @form_manifest = form_manifest
18       self.set_default
19       self.init
20     end
21     
22     def set_default
23       @form_manifest['fields'] ||= {}
24       @form_manifest['field_names'] ||= []
25     end
26     
27     def init
28       @base = @form_manifest['base']
29       @fields = {}
30       @form_manifest['fields'].each {|field_name, field_manifest|
31         @fields[field_name] = List.new(self, field_name, field_manifest)
32       }
33       @field_names = @form_manifest['field_names']
34     end
35     
36   end
37   
38
39 module Pettanr
40   class FormManager
41     class Form
42       class Field
43         class Text
44           def initialize conf, field
45             @conf = conf
46             @field = field
47           end
48           
49           def tag_options
50             opt = @field.tag_options.merge(@conf['options'] || {})
51             @field.element.field_tag_attributes(@field.column, @field.tag_mounted, opt)
52           end
53           
54           def render view
55             view.text_field_tag @field.tag_name, @field.tag_value, self.tag_options
56           end
57           
58         end
59         
60         class TextArea < Text
61           def render view
62             view.text_area_tag @field.tag_name, @field.tag_value, self.tag_options
63           end
64           
65         end
66         
67         class Number < Text
68           def render view
69             view.number_field_tag @field.tag_name, @field.tag_value, self.tag_options
70           end
71           
72         end
73         
74         class Hidden < Text
75           def render view
76             view.hidden_field_tag @field.tag_name, @field.tag_value, self.tag_options
77           end
78           
79         end
80         
81         class Select < Text
82           def initialize conf, field
83             super
84             @model = Pettanr::Application::manifest.model(@field.model_name)
85             @source_conf = @model.attributes[@field.column]['source']
86           end
87           
88           def items
89             Pettanr::Application::manifest.select_items[@source_conf['type']][@source_conf['key']]
90           end
91           
92           def render view
93             view.select_tag @field.tag_name, 
94               view.options_for_select(view.t_select_items(self.items), :selected => @field.tag_value.to_s ), self.tag_options
95           end
96           
97         end
98         
99         class Helper
100           attr :field
101           def initialize field, name, conf
102             @conf = conf
103             @field = field
104             @name = name
105           end
106           
107           def wrapper
108             @conf['wrapper']
109           end
110           
111           def path
112             @conf['path']
113           end
114           
115           def options
116             @conf['options']
117           end
118           
119         end
120         
121         attr :part, :column, :type, :mounted, :model_name, :tag_options, :helpers, :form
122         @@type = {
123           'text' => Text, 'text_area' => TextArea, 'number' => Number, 
124           'hidden' => Hidden, 'select' => Select
125         }
126         def initialize form, mounted, conf, manifest
127           @form = form
128           @mounted = mounted
129           @conf = conf
130           @manifest = manifest
131           
132           @model_name = @conf['model'] || @form.model_name
133           @part = @conf['part']
134           @column = @conf['column']
135           @label_conf = @conf['label'] || {}
136           @field_conf = @conf['field']
137           @helper_confs = @conf['helpers'] || {}
138           
139           @tag_options = {'data-model' => @model_name}
140           
141           @model_manifest =  Pettanr::Application::manifest.model(@model_name)
142           model_attribute_conf =  @model_manifest.attributes[self.column] || {}
143           @primary_key = model_attribute_conf['primary_key']
144           
145           @helpers = @helper_confs.map do |helper_name, helper_conf|
146             Helper.new self, helper_name, helper_conf
147           end
148         end
149         
150         def element
151           @element ||= if self.part?
152             @form.element.__send__ self.part
153           else
154             @form.element
155           end
156         end
157         
158         def part?
159           self.part != nil
160         end
161         
162         def ignore_field?
163           @primary_key and self.element.new_record?
164         end
165         
166         def label?
167           @label_conf['type'] == nil or @label_conf['type'] != 'hidden'
168         end
169         
170         def label view
171           view.t 'activerecord.attributes.' + self.model_name + '.' +  self.column
172         end
173         
174         def label_break?
175           @label_conf['row_break'] == true
176         end
177         
178         def tag_name
179           if self.part?
180             @form.model_name + '[' + self.model_name + '_attributes][' + self.column + ']'
181           else
182             @form.model_name + '[' + self.column + ']'
183           end
184         end
185         
186         def tag_value
187           self.element.attributes[self.column]
188         end
189         
190         def tag_mounted
191           self.mounted ? 0 : 1
192         end
193         
194         def field
195           @field ||= @@type[@field_conf['type']].new @field_conf, self
196         end
197         
198         def has_helper?
199           !@helpers.empty?
200         end
201         
202         def row_break?
203           @conf['row_break'] == true
204         end
205         
206       end
207       
208       attr :element, :mounted, :attributes, :fields, :model_name
209       def initialize element, operators, mounted, manifest
210         @element = element
211         @operators = operators
212         @mounted = mounted
213         @manifest = manifest
214         
215         @base = @manifest.base
216         @model_name = @base || element.model_name
217         
218         base_field_confs = if @base
219           base_form = Pettanr::Application::manifest.form(@base)
220           base_form.fields
221         else
222           {}
223         end
224         extend_field_confs = @manifest.fields
225         @field_confs = base_field_confs.merge(extend_field_confs)
226         @fields = @manifest.field_names.map do |field_name|
227           field_conf = @field_confs[field_name]
228           Field.new self, @mounted, field_conf, manifest
229         end
230       end
231       
232       def name
233         @element.form_name
234       end
235       
236       def each_field
237         @fields.each do |field|
238           next if field.ignore_field?
239           yield field
240         end
241       end
242       
243     end
244     
245     attr :form_manifest, :item_name, :manifest, :form_conf
246     def initialize form_manifest
247       @form_manifest = form_manifest
248       @item_name = @form_manifest.item_name
249       @manifest = @form_manifest.manifest
250       @form_conf = @form_manifest.conf
251       
252     end
253     
254     def open element, operators, mounted
255       Form.new element, operators, mounted, @form_manifest
256     end
257     
258   end
259 end
260