active_form 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,76 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Sample 002</title>
8
+ <script src="js/prototype.js" type="text/javascript"></script>
9
+ <script src="js/effects.js" type="text/javascript"></script>
10
+ <script src="js/validation.js" type="text/javascript" ></script>
11
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
12
+ </head>
13
+ <body>
14
+ <div id="container">
15
+ <form action="#my_form" class="active_form" id="my_form" method="post">
16
+ <fieldset class="form">
17
+ <legend class="form">Example form 002</legend>
18
+ <fieldset class="section">
19
+ <legend class="section">Your details</legend>
20
+ <div id="section-my_form_person">
21
+ <div class="elem_text required" id="elem_my_form_person_first_name">
22
+ <label class="required" for="my_form_person_first_name">First Name</label>
23
+ <input class="required" id="my_form_person_first_name" name="my_form[person][first_name]" type="text"/>
24
+ </div>
25
+ <div class="elem_text required" id="elem_my_form_person_last_name">
26
+ <label class="required" for="my_form_person_last_name">Last Name</label>
27
+ <input class="required" id="my_form_person_last_name" name="my_form[person][last_name]" type="text"/>
28
+ </div>
29
+ <div class="elem_password required" id="elem_my_form_person_password">
30
+ <label class="required" for="my_form_person_password">Password</label>
31
+ <input class="required" id="my_form_person_password" name="my_form[person][password]" type="password"/>
32
+ </div>
33
+ <div class="elem_password required" id="elem_my_form_person_password_confirm">
34
+ <label class="required" for="my_form_person_password_confirm">Password Confirm</label>
35
+ <input class="required" id="my_form_person_password_confirm" name="my_form[person][password_confirm]" type="password"/>
36
+ </div>
37
+ <div class="elem_select" id="elem_my_form_person_country">
38
+ <label for="my_form_person_country">Country</label>
39
+ <select class="elem_select" id="my_form_person_country" name="my_form[person][country]">
40
+ <option value="nl">Nederland</option>
41
+ <option value="be">België</option>
42
+ </select>
43
+ </div>
44
+ <div class="elem_submit" id="elem_my_form_person_submit">
45
+ <input class="elem_submit" id="my_form_person_submit" name="my_form[person][submit]" type="submit" value="Send"/>
46
+ </div>
47
+ </div>
48
+ </fieldset>
49
+ <fieldset class="section">
50
+ <legend class="section">Your message</legend>
51
+ <div id="section-my_form_message">
52
+ <div class="elem_text required" id="elem_my_form_message_subject">
53
+ <label class="required" for="my_form_message_subject">Subject</label>
54
+ <input class="required" id="my_form_message_subject" name="my_form[message][subject]" type="text"/>
55
+ </div>
56
+ <div class="elem_textarea required" id="elem_my_form_message_message">
57
+ <label class="required" for="my_form_message_message">Message</label>
58
+ <textarea class="required" cols="10" id="my_form_message_message" name="my_form[message][message]" rows="5"></textarea>
59
+ </div>
60
+ <div class="elem_submit" id="elem_my_form_message_submit">
61
+ <input class="elem_submit" id="my_form_message_submit" name="my_form[message][submit]" type="submit" value="Send"/>
62
+ </div>
63
+ </div>
64
+ </fieldset>
65
+ </fieldset>
66
+ <script type="text/javascript" charset="utf-8">//<![CDATA[
67
+ var fform_my_form=$('my_form');if(fform_my_form){
68
+ new Validation(fform_my_form, {stopOnFirst:false, useTitles:true});
69
+ }
70
+ //]]>
71
+ </script>
72
+ </form>
73
+
74
+ </div>
75
+ </body>
76
+ </html>
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Sample 003</title>
8
+ <script src="js/prototype.js" type="text/javascript"></script>
9
+ <script src="js/effects.js" type="text/javascript"></script>
10
+ <script src="js/validation.js" type="text/javascript" ></script>
11
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
12
+ </head>
13
+ <body>
14
+ <div id="container">
15
+ <!--o--------------------------[ my_form ]---------------------------o-->
16
+ <form action="#my_form" class="active_form" id="my_form" method="post">
17
+
18
+ <h1>Custom built form</h1>
19
+ <table>
20
+ <tr><td><label class="required" for="my_form_first_name">First Name</label>
21
+ </td><td><input class="elem_text required" id="my_form_first_name" name="my_form[first_name]" type="text"/>
22
+ </td></tr>
23
+ <tr><td><label class="required" for="my_form_last_name">Last Name</label>
24
+ </td><td><input class="elem_text required" id="my_form_last_name" name="my_form[last_name]" type="text"/>
25
+ </td></tr>
26
+ <tr><td></td><td><input class="elem_submit" id="my_form_submit" name="my_form[submit]" type="submit" value="Send"/>
27
+ </td></tr>
28
+ </table>
29
+ </form>
30
+ <!--x--------------------------[ my_form ]---------------------------x-->
31
+
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title><%= title %></title>
8
+ <script src="js/prototype.js" type="text/javascript"></script>
9
+ <script src="js/effects.js" type="text/javascript"></script>
10
+ <script src="js/validation.js" type="text/javascript" ></script>
11
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
12
+ </head>
13
+ <body>
14
+ <div id="container">
15
+ <%= form %>
16
+ </div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title><%= title %></title>
8
+ <script src="js/prototype.js" type="text/javascript"></script>
9
+ <script src="js/effects.js" type="text/javascript"></script>
10
+ <script src="js/validation.js" type="text/javascript" ></script>
11
+ <style type="text/css" media="screen">
12
+ label { display: block };
13
+ .elem_text input, .elem_password input { display: block; }
14
+ </style>
15
+ </head>
16
+ <body>
17
+ <div id="container">
18
+ <%= form %>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title><%= title %></title>
8
+ <script src="js/prototype.js" type="text/javascript"></script>
9
+ <script src="js/effects.js" type="text/javascript"></script>
10
+ <script src="js/validation.js" type="text/javascript" ></script>
11
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
12
+ </head>
13
+ <body>
14
+ <div id="container">
15
+ <%= form.header %>
16
+ <h1>Custom built form</h1>
17
+ <table>
18
+ <tr><td><%= form.label_for_first_name %></td><td><%= form.html_for_first_name %></td></tr>
19
+ <tr><td><%= form.label_for_last_name %></td><td><%= form.html_for_last_name %></td></tr>
20
+ <tr><td></td><td><%= form.html_for_submit %></td></tr>
21
+ </table>
22
+ <%= form.footer %>
23
+ </div>
24
+ </body>
25
+ </html>
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Fabien Franzen on 2006-09-19.
4
+ # Copyright (c) 2006. All rights reserved.
5
+
6
+ require 'erb'
7
+
8
+ require File.join(File.dirname(__FILE__), '../lib/active_form')
9
+ require File.join(ActiveForm::BASE_PATH, '/views/plain.rb')
10
+
11
+ ActiveForm::Definition.create :sample do |f|
12
+
13
+ f.client_side = true
14
+
15
+ f.section :person, :label => 'Your details' do |s|
16
+ s.text_element :first_name, :required => true
17
+ s.text_element :last_name, :required => true
18
+ s.password_element :password, :required => true
19
+ s.password_element :password_confirm, :required => true
20
+ s.select_element :country do |e|
21
+ e.empty = 'choose a country:'
22
+ e.options = [['Nederland', 'nl'], ['België', 'be']]
23
+ end
24
+ s.submit_element :label => 'Send'
25
+ s.after_validation do |elem|
26
+ elem.remove_element :password_confirm if elem.valid?
27
+ end
28
+ end
29
+
30
+ f.section :message, :label => 'Your message' do |s|
31
+ s.text_element :subject, :required => true
32
+ s.textarea_element :message, :required => true, :rows => 5, :cols => 10
33
+ s.submit_element :label => 'Send'
34
+ end
35
+
36
+ f.after_validation do |elem|
37
+ if elem.valid?
38
+ remove_elements_of_type :submit, :button
39
+ elem.disabled = true
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ form = ActiveForm::Definition.build :sample, :my_form, :label => 'Plain View Sample'
46
+
47
+ # form.values[:person][:first_name] = 'Fabien'
48
+ # form.values[:person][:last_name] = 'Franzen'
49
+ # form.values[:person][:password] = form.values[:person][:password_confirm] = 'secret'
50
+ # form.values[:person][:country] = 'be'
51
+ # form.values[:message][:subject] = 'testing...'
52
+ # form.values[:message][:message] = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
53
+ #
54
+ # form.validate
55
+
56
+ title = 'Plain View Sample'
57
+ html = ERB.new(File.read(File.join(File.dirname(__FILE__), 'layouts', 'plain.rhtml')), nil, '-').result
58
+ File.open(File.join(File.dirname(__FILE__), 'html', "#{File.basename(__FILE__, '.rb')}.html"), 'w') { |file| file << html }
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Fabien Franzen on 2006-09-19.
4
+ # Copyright (c) 2006. All rights reserved.
5
+
6
+ require 'erb'
7
+
8
+ require File.join(File.dirname(__FILE__), '../lib/active_form')
9
+
10
+ class String
11
+
12
+ def word_truncate(length = 32, etc = '...')
13
+ return '' if length == 0
14
+ return self if self.length <= length
15
+ fragment = self.slice(0, length)
16
+ fragment.gsub!(/\s+(\S+)?$/, '')
17
+ fragment.gsub!(/[,\.-_?!]$/, '')
18
+ fragment.strip!
19
+ return fragment << etc
20
+ end
21
+
22
+ end
23
+
24
+ ActiveForm::Definition.define_container_wrapper do |builder, elem, render|
25
+ builder.form(elem.element_attributes) {
26
+ builder.table {
27
+ builder.thead { builder.tr { builder.th(elem.label, :colspan => 2) } }
28
+ builder.tbody { elem.render_elements(builder) }
29
+ }
30
+ builder << elem.script_tag
31
+ }
32
+ end
33
+
34
+ ActiveForm::Definition.define_element_wrapper do |builder, elem, render|
35
+ style = StyleAttribute.new
36
+ style << 'display: none' if elem.hidden?
37
+ builder.tr { builder.td { builder.table(:style => style, &render) } }
38
+ end
39
+
40
+ ActiveForm::Element::Base.define_element_wrapper do |builder, elem, render|
41
+ builder.tr(:class => 'label') { builder.td(:colspan => 2) { elem.render_label(builder) } }
42
+ builder.tr(:id => "elem_#{elem.identifier}", :class => elem.css, :style => elem.style) { builder.td(:class => 'elem', :colspan => 2, &render) }
43
+ end
44
+
45
+ ActiveForm::Element::Section.define_element_wrapper do |builder, elem, render|
46
+ builder.tr(:class => 'header') { builder.td(:colspan => 2) { builder.h3(:onclick => "$('section-#{elem.identifier}').toggle()") { elem.render_label(builder) } } }
47
+ builder.tr(:class => 'advice') { builder.td(:colspan => 2) { builder << elem.validation_advice } }
48
+ builder.tr { builder.td { builder.div(:id => "section-#{elem.identifier}") { builder.table(:style => 'background: lightblue;', &render) } } }
49
+ end
50
+
51
+ side_by_side_wrap = proc do |builder, elem, render|
52
+ builder.tr(:id => "elem-#{elem.identifier}") {
53
+ builder.td(:class => 'label') { elem.render_label(builder) }
54
+ builder.td(:class => elem.css, :style => elem.style) { render.call }
55
+ }
56
+ end
57
+
58
+ no_label_wrap = proc do |builder, elem, render|
59
+ builder.tr(:id => "elem-#{elem.identifier}") {
60
+ builder.td(:class => elem.css, :style => elem.style, :colspan => 2) { render.call }
61
+ }
62
+ end
63
+
64
+ form = ActiveForm::compose :myform, :client_side => true do |f|
65
+ f.section :person, :label => 'Your details' do |s|
66
+ s.text_element :first_name, :required => true
67
+ s.text_element :last_name, :required => true
68
+ s.password_element :password, :required => true
69
+ s.password_element :password_confirm, :required => true
70
+ s.select_element :country do |e|
71
+ e.empty = 'choose a country:'
72
+ e.options = [['Nederland', 'nl'], ['België', 'be']]
73
+ e.element_wrapper = side_by_side_wrap
74
+ end
75
+ s.submit_element, :label => 'Send', :element_wrapper => no_label_wrap
76
+ s.after_validation do |elem|
77
+ elem.remove_element :password_confirm if elem.valid?
78
+ end
79
+ end
80
+ f.section :message, :label => 'Your message' do |s|
81
+ s.text_element :subject, :required => true, :element_wrapper => side_by_side_wrap
82
+ s.textarea_element :message, :required => true, :rows => 5, :cols => 10 do |e|
83
+ e.after_validation do |elem|
84
+ elem.frozen_value = elem.formatted_value.word_truncate(32) if elem.valid?
85
+ end
86
+ end
87
+ s.submit_element, :label => 'Send', :element_wrapper => no_label_wrap
88
+ end
89
+ f.after_validation do |elem|
90
+ if elem.valid?
91
+ remove_elements_of_type :submit, :button
92
+ elem.freeze!
93
+ # elem.disabled = true # try this instead of freeze! sometime
94
+ else
95
+ elem.css_style << 'border: 1px solid red'
96
+ end
97
+ end
98
+ end
99
+
100
+ # form.values[:person][:first_name] = 'Fabien'
101
+ # form.values[:person][:last_name] = 'Franzen'
102
+ # form.values[:person][:password] = form.values[:person][:password_confirm] = 'secret'
103
+ # form.values[:person][:country] = 'be'
104
+ # form.values[:message][:subject] = 'testing...'
105
+ # form.values[:message][:message] = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
106
+ #
107
+ # form.validate
108
+
109
+ title = 'Sample 001'
110
+ html = ERB.new(File.read(File.join(File.dirname(__FILE__), 'layouts', 'default.rhtml')), nil, '-').result
111
+ File.open(File.join(File.dirname(__FILE__), 'html', "#{File.basename(__FILE__, '.rb')}.html"), 'w') { |file| file << html }
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Fabien Franzen on 2006-09-19.
4
+ # Copyright (c) 2006. All rights reserved.
5
+
6
+ require 'erb'
7
+
8
+ require File.join(File.dirname(__FILE__), '../lib/active_form')
9
+
10
+ ActiveForm::Definition.define_container_wrapper do |builder, elem, render|
11
+ builder.form(elem.element_attributes) {
12
+ builder.fieldset(:class => 'form') {
13
+ builder.legend(elem.label, :class => 'form')
14
+ elem.render_elements(builder)
15
+ }
16
+ builder << elem.script_tag
17
+ }
18
+ end
19
+
20
+ ActiveForm::Definition.define_element_wrapper do |builder, elem, render|
21
+ style = StyleAttribute.new
22
+ style << 'display: none' if elem.hidden?
23
+ builder.fieldset(:style => style) {
24
+ builder.legend { elem.render_label(builder) }
25
+ builder.div(:id => "sub-#{elem.identifier}", &render)
26
+ }
27
+ end
28
+
29
+ ActiveForm::Element::Base.define_element_wrapper do |builder, elem, render|
30
+ builder.div(:id => "elem_#{elem.identifier}", :class => elem.css, :style => elem.style) {
31
+ elem.render_label(builder)
32
+ render.call(builder)
33
+ }
34
+ end
35
+
36
+ ActiveForm::Element::Section.define_element_wrapper do |builder, elem, render|
37
+ builder.fieldset(:class => 'section') {
38
+ builder.legend(elem.label, :class => 'section')
39
+ builder.div(:id => "section-#{elem.identifier}", &render)
40
+ }
41
+ end
42
+
43
+ ActiveForm::Definition.create :sample_002 do |f|
44
+
45
+ f.client_side = true
46
+
47
+ f.section :person, :label => 'Your details' do |s|
48
+ s.text_element :first_name, :required => true
49
+ s.text_element :last_name, :required => true
50
+ s.password_element :password, :required => true
51
+ s.password_element :password_confirm, :required => true
52
+ s.select_element :country do |e|
53
+ e.empty = 'choose a country:'
54
+ e.options = [['Nederland', 'nl'], ['België', 'be']]
55
+ end
56
+ s.submit_element :label => 'Send'
57
+ s.after_validation do |elem|
58
+ elem.remove_element :password_confirm if elem.valid?
59
+ end
60
+ end
61
+
62
+ f.section :message, :label => 'Your message' do |s|
63
+ s.text_element :subject, :required => true
64
+ s.textarea_element :message, :required => true, :rows => 5, :cols => 10
65
+ s.submit_element :label => 'Send'
66
+ end
67
+
68
+ f.after_validation do |elem|
69
+ if elem.valid?
70
+ remove_elements_of_type :submit, :button
71
+ elem.disabled = true
72
+ else
73
+ elem.css_style << 'border: 1px solid red'
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ form = ActiveForm::Definition.build :sample_002, :my_form, :label => 'Example form 002'
80
+
81
+ # form.values[:person][:first_name] = 'Fabien'
82
+ # form.values[:person][:last_name] = 'Franzen'
83
+ # form.values[:person][:password] = form.values[:person][:password_confirm] = 'secret'
84
+ # form.values[:person][:country] = 'be'
85
+ # form.values[:message][:subject] = 'testing...'
86
+ # form.values[:message][:message] = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
87
+ #
88
+ # form.validate
89
+
90
+ title = 'Sample 002'
91
+ html = ERB.new(File.read(File.join(File.dirname(__FILE__), 'layouts', 'default.rhtml')), nil, '-').result
92
+ File.open(File.join(File.dirname(__FILE__), 'html', "#{File.basename(__FILE__, '.rb')}.html"), 'w') { |file| file << html }