active_form 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. data.tar.gz.sig +2 -0
  2. data/History.txt +4 -0
  3. data/License.txt +20 -0
  4. data/MIT-LICENSE +19 -0
  5. data/Manifest.txt +181 -0
  6. data/README.txt +1 -0
  7. data/Rakefile +4 -0
  8. data/config/hoe.rb +71 -0
  9. data/config/requirements.rb +17 -0
  10. data/init.rb +5 -0
  11. data/lib/active_form.rb +86 -0
  12. data/lib/active_form/core_extensions.rb +179 -0
  13. data/lib/active_form/definition.rb +72 -0
  14. data/lib/active_form/element.rb +50 -0
  15. data/lib/active_form/elements/base.rb +67 -0
  16. data/lib/active_form/elements/builder.rb +103 -0
  17. data/lib/active_form/elements/button.rb +15 -0
  18. data/lib/active_form/elements/checkbox.rb +18 -0
  19. data/lib/active_form/elements/file.rb +15 -0
  20. data/lib/active_form/elements/hidden.rb +9 -0
  21. data/lib/active_form/elements/image.rb +7 -0
  22. data/lib/active_form/elements/input.rb +23 -0
  23. data/lib/active_form/elements/password.rb +12 -0
  24. data/lib/active_form/elements/radio.rb +18 -0
  25. data/lib/active_form/elements/reset.rb +15 -0
  26. data/lib/active_form/elements/section.rb +37 -0
  27. data/lib/active_form/elements/select.rb +42 -0
  28. data/lib/active_form/elements/submit.rb +19 -0
  29. data/lib/active_form/elements/text.rb +9 -0
  30. data/lib/active_form/elements/textarea.rb +18 -0
  31. data/lib/active_form/errors.rb +73 -0
  32. data/lib/active_form/facets/checkbox_group.rb +11 -0
  33. data/lib/active_form/facets/collection_input.rb +96 -0
  34. data/lib/active_form/facets/radio_group.rb +11 -0
  35. data/lib/active_form/facets/select_date.rb +10 -0
  36. data/lib/active_form/facets/select_datetime.rb +10 -0
  37. data/lib/active_form/facets/select_day.rb +17 -0
  38. data/lib/active_form/facets/select_from_model.rb +60 -0
  39. data/lib/active_form/facets/select_hour.rb +17 -0
  40. data/lib/active_form/facets/select_minute.rb +17 -0
  41. data/lib/active_form/facets/select_month.rb +46 -0
  42. data/lib/active_form/facets/select_numeric_range.rb +59 -0
  43. data/lib/active_form/facets/select_second.rb +17 -0
  44. data/lib/active_form/facets/select_time.rb +10 -0
  45. data/lib/active_form/facets/select_timebased.rb +145 -0
  46. data/lib/active_form/facets/select_weekday.rb +46 -0
  47. data/lib/active_form/facets/select_year.rb +24 -0
  48. data/lib/active_form/mixins/attribute_methods.rb +33 -0
  49. data/lib/active_form/mixins/casting.rb +152 -0
  50. data/lib/active_form/mixins/collection_element_methods.rb +204 -0
  51. data/lib/active_form/mixins/common_methods.rb +350 -0
  52. data/lib/active_form/mixins/container_methods.rb +417 -0
  53. data/lib/active_form/mixins/css_methods.rb +70 -0
  54. data/lib/active_form/mixins/element_methods.rb +314 -0
  55. data/lib/active_form/mixins/javascript_methods.rb +99 -0
  56. data/lib/active_form/mixins/loader_methods.rb +72 -0
  57. data/lib/active_form/mixins/option_element_methods.rb +61 -0
  58. data/lib/active_form/mixins/validation_methods.rb +253 -0
  59. data/lib/active_form/validator.rb +47 -0
  60. data/lib/active_form/validators/alpha.rb +9 -0
  61. data/lib/active_form/validators/alphanum.rb +9 -0
  62. data/lib/active_form/validators/base.rb +132 -0
  63. data/lib/active_form/validators/digits.rb +9 -0
  64. data/lib/active_form/validators/email.rb +29 -0
  65. data/lib/active_form/validators/format.rb +15 -0
  66. data/lib/active_form/validators/length_range.rb +24 -0
  67. data/lib/active_form/validators/number.rb +9 -0
  68. data/lib/active_form/validators/option_count.rb +24 -0
  69. data/lib/active_form/validators/proc.rb +22 -0
  70. data/lib/active_form/validators/required.rb +9 -0
  71. data/lib/active_form/validators/set.rb +21 -0
  72. data/lib/active_form/validators/time_range.rb +30 -0
  73. data/lib/active_form/validators/uri.rb +54 -0
  74. data/lib/active_form/version.rb +9 -0
  75. data/lib/active_form/views/fieldsets.rb +34 -0
  76. data/lib/active_form/views/plain.rb +32 -0
  77. data/lib/active_form/views/tables.rb +28 -0
  78. data/lib/active_form/widget.rb +43 -0
  79. data/lib/active_form/widgets/base.rb +28 -0
  80. data/lib/loob/uri_validator.rb +140 -0
  81. data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
  82. data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
  83. data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
  84. data/lib/rails/controller_helper.rb +19 -0
  85. data/lib/rails/model/loader.rb +206 -0
  86. data/lib/rails/view_helper.rb +20 -0
  87. data/samples/html/css/style.css +175 -0
  88. data/samples/html/js/effects.js +958 -0
  89. data/samples/html/js/prototype.js +2006 -0
  90. data/samples/html/js/validation.js +228 -0
  91. data/samples/html/plain_view.html +77 -0
  92. data/samples/html/sample001.html +158 -0
  93. data/samples/html/sample002.html +76 -0
  94. data/samples/html/sample003.html +34 -0
  95. data/samples/layouts/default.rhtml +18 -0
  96. data/samples/layouts/plain.rhtml +21 -0
  97. data/samples/layouts/sample003.rhtml +25 -0
  98. data/samples/plain_view.rb +58 -0
  99. data/samples/sample001.rb +111 -0
  100. data/samples/sample002.rb +92 -0
  101. data/samples/sample003.rb +30 -0
  102. data/script/destroy +14 -0
  103. data/script/generate +14 -0
  104. data/script/txt2html +74 -0
  105. data/setup.rb +1585 -0
  106. data/tasks/deployment.rake +34 -0
  107. data/tasks/environment.rake +7 -0
  108. data/tasks/website.rake +17 -0
  109. data/test/elements/test_base_element.rb +159 -0
  110. data/test/elements/test_builder_element.rb +81 -0
  111. data/test/elements/test_button_element.rb +12 -0
  112. data/test/elements/test_checkbox_element.rb +233 -0
  113. data/test/elements/test_file_element.rb +20 -0
  114. data/test/elements/test_hidden_element.rb +11 -0
  115. data/test/elements/test_image_element.rb +11 -0
  116. data/test/elements/test_input_element.rb +39 -0
  117. data/test/elements/test_password_element.rb +16 -0
  118. data/test/elements/test_radio_element.rb +197 -0
  119. data/test/elements/test_reset_element.rb +12 -0
  120. data/test/elements/test_section_element.rb +162 -0
  121. data/test/elements/test_select_element.rb +364 -0
  122. data/test/elements/test_submit_element.rb +12 -0
  123. data/test/elements/test_text_element.rb +91 -0
  124. data/test/elements/test_textarea_element.rb +23 -0
  125. data/test/facets/test_checkbox_group_element.rb +388 -0
  126. data/test/facets/test_radio_group_element.rb +312 -0
  127. data/test/facets/test_select_date_element.rb +211 -0
  128. data/test/facets/test_select_datetime_element.rb +56 -0
  129. data/test/facets/test_select_day_element.rb +37 -0
  130. data/test/facets/test_select_from_model_element.rb +86 -0
  131. data/test/facets/test_select_hour_element.rb +37 -0
  132. data/test/facets/test_select_minute_element.rb +52 -0
  133. data/test/facets/test_select_month_element.rb +79 -0
  134. data/test/facets/test_select_numeric_range_element.rb +14 -0
  135. data/test/facets/test_select_second_element.rb +48 -0
  136. data/test/facets/test_select_time_element.rb +148 -0
  137. data/test/facets/test_select_weekday_element.rb +71 -0
  138. data/test/facets/test_select_year_element.rb +73 -0
  139. data/test/fixtures/author.rb +11 -0
  140. data/test/fixtures/authors.yml +0 -0
  141. data/test/fixtures/book.rb +14 -0
  142. data/test/fixtures/books.yml +8 -0
  143. data/test/fixtures/categories.yml +0 -0
  144. data/test/fixtures/categorization.rb +2 -0
  145. data/test/fixtures/categorizations.yml +0 -0
  146. data/test/fixtures/category.rb +8 -0
  147. data/test/fixtures/publisher.rb +5 -0
  148. data/test/fixtures/publishers.yml +10 -0
  149. data/test/fixtures/schema.rb +43 -0
  150. data/test/rails/test_model_autodefinition.rb +121 -0
  151. data/test/rails/test_model_loader.rb +61 -0
  152. data/test/resources/elements/chunky.rb +11 -0
  153. data/test/resources/forms/demo.rb +5 -0
  154. data/test/resources/models/book.rb +8 -0
  155. data/test/resources/models/register_publisher.rb +5 -0
  156. data/test/resources/sections/demo.rb +6 -0
  157. data/test/resources/sections/foo.rb +6 -0
  158. data/test/resources/validators/foo.rb +9 -0
  159. data/test/resources/widgets/custom.rb +13 -0
  160. data/test/test_active_form.rb +1050 -0
  161. data/test/test_casting.rb +124 -0
  162. data/test/test_definition.rb +68 -0
  163. data/test/test_definition_class.rb +118 -0
  164. data/test/test_element_class.rb +201 -0
  165. data/test/test_helper.rb +74 -0
  166. data/test/test_javascript.rb +234 -0
  167. data/test/test_load_definition.rb +68 -0
  168. data/test/test_load_element.rb +35 -0
  169. data/test/test_load_section_element.rb +43 -0
  170. data/test/test_load_validator.rb +31 -0
  171. data/test/test_load_widget.rb +93 -0
  172. data/test/test_validation.rb +722 -0
  173. data/test/validators/test_validates_as_alpha.rb +26 -0
  174. data/test/validators/test_validates_as_alphanum.rb +26 -0
  175. data/test/validators/test_validates_as_digits.rb +26 -0
  176. data/test/validators/test_validates_as_email.rb +29 -0
  177. data/test/validators/test_validates_as_number.rb +26 -0
  178. data/test/validators/test_validates_as_uri.rb +128 -0
  179. data/test/validators/test_validates_with_format.rb +26 -0
  180. data/test/validators/test_validates_within_length_range.rb +46 -0
  181. data/test/validators/test_validates_within_set.rb +46 -0
  182. data/test/validators/test_validates_within_time_range.rb +53 -0
  183. metadata +307 -0
  184. metadata.gz.sig +4 -0
@@ -0,0 +1,417 @@
1
+ module ActiveForm::Mixins::ContainerMethods
2
+
3
+ def self.included(base)
4
+ base.send(:include, ActiveForm::Mixins::LoaderMethods)
5
+ base.send(:include, Enumerable)
6
+ base.send(:include, ElementMethods)
7
+ base.send(:extend, ClassMethods)
8
+ end
9
+
10
+ def validated?
11
+ submitted? && validate
12
+ end
13
+
14
+ def submitted?
15
+ not get_elements_of_type(:submit).all?(&:blank?)
16
+ end
17
+ alias :sent? :submitted?
18
+
19
+ def get_bound_value(name)
20
+ self.element_value.bound_value(name) rescue nil
21
+ end
22
+
23
+ def set_bound_value(name, value)
24
+ self.element_value.bound_value(name, value) rescue nil
25
+ end
26
+
27
+ def bound_value?(name)
28
+ self.element_value.bound_value?(name)
29
+ end
30
+
31
+ def export_value(values = ActiveForm::Values.new)
32
+ elements.inject(values) do |vals, elem|
33
+ if elem.group.blank?
34
+ vals[elem.name] = elem.export_value
35
+ else
36
+ if elem.element_type == :radio
37
+ vals[elem.group] ||= nil
38
+ vals[elem.group] = elem.export_value unless elem.blank?
39
+ else
40
+ vals[elem.group] ||= []
41
+ vals[elem.group] << elem.export_value unless elem.blank?
42
+ end
43
+ end
44
+ vals
45
+ end
46
+ end
47
+ alias :export_values :export_value
48
+
49
+ def update_value(value, force = false)
50
+ if self.contained?
51
+ self.element_value = value
52
+ else
53
+ if value.respond_to?(:key?) && !value.empty?
54
+ elements.each do |e|
55
+ e.update_value(value[e.name] || e.default_value) if force || value.key?(e.name) || e.respond_to?(:checked?)
56
+ end
57
+ else
58
+ self.element_value = default_value
59
+ end
60
+ self.element_value
61
+ end
62
+ end
63
+ alias :update_values :update_value
64
+
65
+ def update_from_params(params, force = false)
66
+ if params.respond_to?(:key?) && !params.empty?
67
+ value = ActiveForm::Values.new(params) rescue default_value
68
+ value = (value[self.name] || value[self.name.to_s] || default_value) unless self.contained?
69
+ elements.each do |e|
70
+ e.update_from_params(value[e.name] || e.default_value) if force || value.key?(e.name) || e.respond_to?(:checked?)
71
+ end
72
+ else
73
+ self.element_value = default_value
74
+ end
75
+ self.element_value
76
+ end
77
+ alias :update_values_from_params :update_from_params
78
+ alias :params= :update_from_params
79
+
80
+ def label
81
+ return (localize(nil, 'label') || @label) if localized?
82
+ @label
83
+ end
84
+
85
+ def title
86
+ return (localize(nil, 'title') || attributes[:title]) if localized?
87
+ attributes[:title]
88
+ end
89
+
90
+ def description
91
+ return (localize(nil, 'description') || @description) if localized?
92
+ @description
93
+ end
94
+
95
+ def define_localizer(prc = nil, &block)
96
+ @localizer = (block_given? ? block : prc)
97
+ end
98
+ alias :localizer= :define_localizer
99
+
100
+ def localize(*args)
101
+ @localizer.call(identifier, *args) if localized?
102
+ end
103
+
104
+ def localized?
105
+ (@localizer ||= nil).kind_of?(Proc)
106
+ end
107
+
108
+ def localizer
109
+ localized? ? @localizer : nil
110
+ end
111
+
112
+ module ElementMethods
113
+
114
+ def each(&block)
115
+ elements.each(&block)
116
+ end
117
+
118
+ def recurse(&block)
119
+ elements.each do |elem|
120
+ block.call(elem)
121
+ elem.recurse(&block) if elem.container? && elem.elements?
122
+ end
123
+ end
124
+
125
+ def append_sections(*defnames)
126
+ index = defnames.last.kind_of?(Integer) ? defnames.pop : -1
127
+ sections = defnames.inject([]) do |ary, name|
128
+ args = name.kind_of?(Array) ? name : [name]
129
+ section = ActiveForm::Element::Section::build(*args)
130
+ ary << section unless section.nil?
131
+ ary
132
+ end
133
+ insert_elements(sections, index)
134
+ end
135
+ alias :append_section :append_sections
136
+
137
+ def define_form(*args, &block)
138
+ args.unshift(self)
139
+ form = ActiveForm::compose(*args, &block)
140
+ insert_element(form, false) && form
141
+ end
142
+
143
+ def define_section(*args, &block)
144
+ define_element(:section, *args, &block)
145
+ end
146
+ alias :section :define_section
147
+
148
+ def define_builder(*args, &block)
149
+ define_element(:builder, *args, &block)
150
+ end
151
+ alias :builder :define_builder
152
+ alias :html :define_builder
153
+
154
+ def define_widget(type, *args, &block)
155
+ args.unshift(self)
156
+ element = ActiveForm::Widget::build(type, *args, &block)
157
+ insert_element(element, false) && element unless element.nil?
158
+ element
159
+ end
160
+
161
+ def define_element(type, *args, &block)
162
+ args.unshift(self)
163
+ element = ActiveForm::Element::build(type, *args, &block)
164
+ insert_element(element, false) && element unless element.nil?
165
+ element
166
+ end
167
+ alias :define_element_at_bottom :define_element
168
+
169
+ def define_element_at(index, type, *args, &block)
170
+ args.unshift(self)
171
+ element = ActiveForm::Element::build(type, *args, &block)
172
+ insert_element(element, index, false) && element unless element.nil?
173
+ element
174
+ end
175
+
176
+ def define_element_at_top(type, *args, &block)
177
+ args.unshift(self)
178
+ element = ActiveForm::Element::build(type, *args, &block)
179
+ insert_element(element, 0, false) && element unless element.nil?
180
+ element
181
+ end
182
+
183
+ def insert_element(*elem)
184
+ insert_elements(*elem).last
185
+ end
186
+
187
+ def insert_elements(*elems)
188
+ elems.flatten!
189
+ do_registration = elems.last === false ? elems.pop : true
190
+ index = elems.last.kind_of?(Integer) ? elems.pop : -1
191
+ first_index = index < 0 ? elements.length + 1 + index : index
192
+ first_index = 0 if first_index < 0
193
+ elems.each_with_index do |elem, i|
194
+ if elem.kind_of?(Symbol)
195
+ elem = ActiveForm::Element::Section::build(elem)
196
+ elsif elem.kind_of?(String)
197
+ elem = ActiveForm::Element::build(:builder, :html => elem)
198
+ end
199
+ if ActiveForm::Element::element?(elem)
200
+ elem.register_container(self) if do_registration
201
+ elements.insert(first_index + i, elem)
202
+ end
203
+ end
204
+ reindex_name_to_index_lookup!
205
+ elements
206
+ end
207
+ alias :append_form :insert_elements
208
+ alias :<< :insert_elements
209
+
210
+ def insert_element_at_top(*elems)
211
+ insert_elements(*(elems << 0)).last
212
+ end
213
+
214
+ def insert_elements_at_top(*elems)
215
+ insert_elements(*(elems << 0))
216
+ end
217
+
218
+ def update_elements(*args)
219
+ attrs = args.last.kind_of?(Hash) ? args.pop : {}
220
+ elem_names = args.length > 0 ? args.flatten : self.element_names
221
+ elem_names.each do |elem_name|
222
+ name = ActiveForm::symbolize_name(elem_name)
223
+ if element_exists?(name)
224
+ if self[name].respond_to?(:update_elements)
225
+ self[name].update_elements(attrs.dup)
226
+ else
227
+ self[name].update(attrs.dup)
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ def elements
234
+ @elements ||= []
235
+ @elements
236
+ end
237
+
238
+ def elements=(*elems)
239
+ reset_elements!
240
+ insert_elements(*elems)
241
+ end
242
+
243
+ def elements?
244
+ !elements.empty?
245
+ end
246
+
247
+ def get_and_render_to_html(name, builder = create_builder)
248
+ elem = get_element(name)
249
+ elem ? elem.to_html(builder) : nil
250
+ end
251
+
252
+ def get_and_render_label(name, builder = create_builder)
253
+ elem = get_element(name)
254
+ elem ? elem.render_label(builder) : nil
255
+ end
256
+
257
+ def get_element(name)
258
+ name = ActiveForm::symbolize_name(name)
259
+ if index = index_of_element(name)
260
+ return elements[index]
261
+ end
262
+ return nil
263
+ end
264
+ alias :[] :get_element
265
+
266
+ def get_elements_of_type(*types)
267
+ types.flatten.inject([]) do |elems, type|
268
+ self.recurse { |e| elems << e if type == e.element_type }
269
+ elems
270
+ end
271
+ end
272
+
273
+ def set_element(name, elem)
274
+ name = ActiveForm::symbolize_name(name)
275
+ raise ActiveForm::Element::MismatchException unless name == elem.name
276
+ raise ActiveForm::Element::NoElemException unless is_element?(elem)
277
+ if index = index_of_element(name)
278
+ elem.register_container(self)
279
+ return elements[index] = elem
280
+ end
281
+ return nil
282
+ end
283
+ alias :[]= :set_element
284
+ alias :replace :set_element
285
+
286
+ def remove_elements(*names)
287
+ names.flatten.each { |name| elements.delete_at(index_of_element(name)); reindex_name_to_index_lookup! }
288
+ end
289
+ alias :remove_element :remove_elements
290
+
291
+ def remove_elements_at(*indices)
292
+ remove_elements(element_names_from_indices(indices))
293
+ end
294
+ alias :remove_element_at :remove_elements_at
295
+
296
+ def remove_elements_of_type(*types)
297
+ types.flatten.each do |type|
298
+ self.recurse { |e| e.container.remove_element(e.name) if e.contained? && type == e.element_type }
299
+ end
300
+ end
301
+
302
+ def element_exists?(name)
303
+ name = ActiveForm::symbolize_name(name)
304
+ name_to_index_lookup.include?(name)
305
+ end
306
+
307
+ def index_of_element(name)
308
+ name = ActiveForm::symbolize_name(name)
309
+ return nil unless element_exists?(name)
310
+ name_to_index_lookup[name]
311
+ end
312
+ alias :index_of :index_of_element
313
+
314
+ def get_element_by_index(index)
315
+ self.elements[index]
316
+ end
317
+ alias :element_at :get_element_by_index
318
+
319
+ def element_names_from_indices(*indices)
320
+ indices.flatten.collect { |idx| get_element_by_index(idx) }.compact.collect(&:name)
321
+ end
322
+
323
+ def element_names
324
+ elements.collect(&:name)
325
+ end
326
+
327
+ def reset_elements!
328
+ elements.clear
329
+ reindex_name_to_index_lookup!
330
+ end
331
+
332
+ def rebuild!
333
+ reset_elements!
334
+ after_initialize
335
+ end
336
+
337
+ def name_to_index_lookup
338
+ @name_to_index_lookup ||= {}
339
+ @name_to_index_lookup
340
+ end
341
+
342
+ def default_value
343
+ ActiveForm::Values.new
344
+ end
345
+
346
+ private
347
+
348
+ def name_to_index_lookup=(lookup) # prevent access
349
+ end
350
+
351
+ def reindex_name_to_index_lookup!
352
+ name_to_index_lookup.clear
353
+ elements.each_with_index { |elem, index| name_to_index_lookup[elem.name] = index }
354
+ end
355
+
356
+ def method_missing(method, *args, &block)
357
+ if (match = /^html_for_(.*)$/.match(method.to_s))
358
+ get_and_render_to_html(match.captures[0], *args)
359
+ elsif (match = /^label_for_(.*)$/.match(method.to_s))
360
+ get_and_render_label(match.captures[0], *args)
361
+ elsif (match = /^(.*)_element$/.match(method.to_s)) && ActiveForm::Element::exists?(match.captures[0])
362
+ define_element(match.captures[0], *args, &block)
363
+ elsif (match = /^(.*)_widget$/.match(method.to_s)) && ActiveForm::Widget::exists?(match.captures[0])
364
+ define_widget(match.captures[0], *args, &block)
365
+ elsif (match = /^validates_(with_|as_|within_)?(.*)$/.match(method.to_s)) && ActiveForm::Validator::exists?(match.captures[1])
366
+ define_validator(match.captures[1], *args, &block)
367
+ elsif (match = /^select_from_(.*)$/.match(method.to_s))
368
+ options = args.last.is_a?(Hash) ? args.pop : {}
369
+ args.push(options.merge(:model => match.captures[0], :to_dropdown => true))
370
+ define_element(:select_from_model, *args, &block)
371
+ else
372
+ super
373
+ end
374
+ end
375
+
376
+ end
377
+
378
+ module ClassMethods
379
+
380
+ def load_paths
381
+ @@load_paths ||= []
382
+ end
383
+
384
+ def create(definition_name, prc = nil, &block)
385
+ class_name = type_classname(definition_name)
386
+ if !ActiveForm.const_defined?(class_name)
387
+ ActiveForm.const_set(class_name, Class.new(self))
388
+ if klass = ActiveForm.const_get(class_name)
389
+ klass.setup_proc = (block_given? ? block : prc)
390
+ return klass
391
+ end
392
+ end
393
+ nil
394
+ end
395
+
396
+ def instance(definition_name, klass, *args, &block)
397
+ args.unshift(definition_name) if args.empty? || args.first.kind_of?(Hash)
398
+ item = klass.new(*args)
399
+ item.instance_eval(&block) if block_given?
400
+ item
401
+ end
402
+
403
+ def get(type, &block)
404
+ load(type) rescue nil unless loaded?(type)
405
+ klass = ActiveForm.const_get(type_classname(type)) rescue nil
406
+ klass.module_eval(&block) if klass && block_given?
407
+ klass
408
+ end
409
+ alias :modify :get
410
+
411
+ def type_classname(definition_name)
412
+ "#{definition_name}_#{element_type}".classify
413
+ end
414
+
415
+ end
416
+
417
+ end
@@ -0,0 +1,70 @@
1
+ module ActiveForm::Mixins::CssMethods #:nodoc:
2
+
3
+ def default_css_class
4
+ "active_#{element_type}"
5
+ end
6
+
7
+ def runtime_css_class
8
+ cclass = CssAttribute.new
9
+ cclass << 'frozen' if frozen?
10
+ cclass << 'hidden' if hidden?
11
+ cclass << 'disabled' if disabled?
12
+ cclass << 'readonly' if readonly?
13
+ cclass << 'required' if required?
14
+ cclass << 'validation-failed' unless valid?
15
+ cclass << validation_css_class if !container? && client_side?
16
+ cclass
17
+ end
18
+
19
+ def label_css_class
20
+ cclass = CssAttribute.new
21
+ cclass << 'inactive' if readonly? || disabled? || frozen?
22
+ cclass << 'hidden' if hidden?
23
+ cclass << 'required' if required?
24
+ cclass << 'validation-failed' unless valid?
25
+ cclass << 'label' if container?
26
+ cclass
27
+ end
28
+
29
+ def label_css
30
+ label_css_class.to_s
31
+ end
32
+
33
+ def element_class
34
+ (css_class.dup << runtime_css_class << default_css_class).to_s
35
+ end
36
+ alias :css :element_class
37
+
38
+ def css_class
39
+ @css_class_attribute ||= CssAttribute.new.push(default_css_class)
40
+ end
41
+
42
+ def css_class=(string_or_array)
43
+ css_class.replace(string_or_array)
44
+ end
45
+ alias :class= :css_class=
46
+
47
+ def default_css_style
48
+ ""
49
+ end
50
+
51
+ def runtime_css_style
52
+ cstyle = StyleAttribute.new
53
+ cstyle << 'display: none' if hidden?
54
+ end
55
+
56
+ def element_style
57
+ (css_style.dup << runtime_css_style).to_s
58
+ end
59
+ alias :style :element_style
60
+
61
+ def css_style
62
+ @css_style_attribute ||= StyleAttribute.new.push(default_css_style)
63
+ end
64
+
65
+ def css_style=(string_or_array)
66
+ css_style.replace(string_or_array)
67
+ end
68
+ alias :style= :css_style=
69
+
70
+ end