active_form 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +2 -0
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/MIT-LICENSE +19 -0
- data/Manifest.txt +181 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/init.rb +5 -0
- data/lib/active_form.rb +86 -0
- data/lib/active_form/core_extensions.rb +179 -0
- data/lib/active_form/definition.rb +72 -0
- data/lib/active_form/element.rb +50 -0
- data/lib/active_form/elements/base.rb +67 -0
- data/lib/active_form/elements/builder.rb +103 -0
- data/lib/active_form/elements/button.rb +15 -0
- data/lib/active_form/elements/checkbox.rb +18 -0
- data/lib/active_form/elements/file.rb +15 -0
- data/lib/active_form/elements/hidden.rb +9 -0
- data/lib/active_form/elements/image.rb +7 -0
- data/lib/active_form/elements/input.rb +23 -0
- data/lib/active_form/elements/password.rb +12 -0
- data/lib/active_form/elements/radio.rb +18 -0
- data/lib/active_form/elements/reset.rb +15 -0
- data/lib/active_form/elements/section.rb +37 -0
- data/lib/active_form/elements/select.rb +42 -0
- data/lib/active_form/elements/submit.rb +19 -0
- data/lib/active_form/elements/text.rb +9 -0
- data/lib/active_form/elements/textarea.rb +18 -0
- data/lib/active_form/errors.rb +73 -0
- data/lib/active_form/facets/checkbox_group.rb +11 -0
- data/lib/active_form/facets/collection_input.rb +96 -0
- data/lib/active_form/facets/radio_group.rb +11 -0
- data/lib/active_form/facets/select_date.rb +10 -0
- data/lib/active_form/facets/select_datetime.rb +10 -0
- data/lib/active_form/facets/select_day.rb +17 -0
- data/lib/active_form/facets/select_from_model.rb +60 -0
- data/lib/active_form/facets/select_hour.rb +17 -0
- data/lib/active_form/facets/select_minute.rb +17 -0
- data/lib/active_form/facets/select_month.rb +46 -0
- data/lib/active_form/facets/select_numeric_range.rb +59 -0
- data/lib/active_form/facets/select_second.rb +17 -0
- data/lib/active_form/facets/select_time.rb +10 -0
- data/lib/active_form/facets/select_timebased.rb +145 -0
- data/lib/active_form/facets/select_weekday.rb +46 -0
- data/lib/active_form/facets/select_year.rb +24 -0
- data/lib/active_form/mixins/attribute_methods.rb +33 -0
- data/lib/active_form/mixins/casting.rb +152 -0
- data/lib/active_form/mixins/collection_element_methods.rb +204 -0
- data/lib/active_form/mixins/common_methods.rb +350 -0
- data/lib/active_form/mixins/container_methods.rb +417 -0
- data/lib/active_form/mixins/css_methods.rb +70 -0
- data/lib/active_form/mixins/element_methods.rb +314 -0
- data/lib/active_form/mixins/javascript_methods.rb +99 -0
- data/lib/active_form/mixins/loader_methods.rb +72 -0
- data/lib/active_form/mixins/option_element_methods.rb +61 -0
- data/lib/active_form/mixins/validation_methods.rb +253 -0
- data/lib/active_form/validator.rb +47 -0
- data/lib/active_form/validators/alpha.rb +9 -0
- data/lib/active_form/validators/alphanum.rb +9 -0
- data/lib/active_form/validators/base.rb +132 -0
- data/lib/active_form/validators/digits.rb +9 -0
- data/lib/active_form/validators/email.rb +29 -0
- data/lib/active_form/validators/format.rb +15 -0
- data/lib/active_form/validators/length_range.rb +24 -0
- data/lib/active_form/validators/number.rb +9 -0
- data/lib/active_form/validators/option_count.rb +24 -0
- data/lib/active_form/validators/proc.rb +22 -0
- data/lib/active_form/validators/required.rb +9 -0
- data/lib/active_form/validators/set.rb +21 -0
- data/lib/active_form/validators/time_range.rb +30 -0
- data/lib/active_form/validators/uri.rb +54 -0
- data/lib/active_form/version.rb +9 -0
- data/lib/active_form/views/fieldsets.rb +34 -0
- data/lib/active_form/views/plain.rb +32 -0
- data/lib/active_form/views/tables.rb +28 -0
- data/lib/active_form/widget.rb +43 -0
- data/lib/active_form/widgets/base.rb +28 -0
- data/lib/loob/uri_validator.rb +140 -0
- data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
- data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
- data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
- data/lib/rails/controller_helper.rb +19 -0
- data/lib/rails/model/loader.rb +206 -0
- data/lib/rails/view_helper.rb +20 -0
- data/samples/html/css/style.css +175 -0
- data/samples/html/js/effects.js +958 -0
- data/samples/html/js/prototype.js +2006 -0
- data/samples/html/js/validation.js +228 -0
- data/samples/html/plain_view.html +77 -0
- data/samples/html/sample001.html +158 -0
- data/samples/html/sample002.html +76 -0
- data/samples/html/sample003.html +34 -0
- data/samples/layouts/default.rhtml +18 -0
- data/samples/layouts/plain.rhtml +21 -0
- data/samples/layouts/sample003.rhtml +25 -0
- data/samples/plain_view.rb +58 -0
- data/samples/sample001.rb +111 -0
- data/samples/sample002.rb +92 -0
- data/samples/sample003.rb +30 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/elements/test_base_element.rb +159 -0
- data/test/elements/test_builder_element.rb +81 -0
- data/test/elements/test_button_element.rb +12 -0
- data/test/elements/test_checkbox_element.rb +233 -0
- data/test/elements/test_file_element.rb +20 -0
- data/test/elements/test_hidden_element.rb +11 -0
- data/test/elements/test_image_element.rb +11 -0
- data/test/elements/test_input_element.rb +39 -0
- data/test/elements/test_password_element.rb +16 -0
- data/test/elements/test_radio_element.rb +197 -0
- data/test/elements/test_reset_element.rb +12 -0
- data/test/elements/test_section_element.rb +162 -0
- data/test/elements/test_select_element.rb +364 -0
- data/test/elements/test_submit_element.rb +12 -0
- data/test/elements/test_text_element.rb +91 -0
- data/test/elements/test_textarea_element.rb +23 -0
- data/test/facets/test_checkbox_group_element.rb +388 -0
- data/test/facets/test_radio_group_element.rb +312 -0
- data/test/facets/test_select_date_element.rb +211 -0
- data/test/facets/test_select_datetime_element.rb +56 -0
- data/test/facets/test_select_day_element.rb +37 -0
- data/test/facets/test_select_from_model_element.rb +86 -0
- data/test/facets/test_select_hour_element.rb +37 -0
- data/test/facets/test_select_minute_element.rb +52 -0
- data/test/facets/test_select_month_element.rb +79 -0
- data/test/facets/test_select_numeric_range_element.rb +14 -0
- data/test/facets/test_select_second_element.rb +48 -0
- data/test/facets/test_select_time_element.rb +148 -0
- data/test/facets/test_select_weekday_element.rb +71 -0
- data/test/facets/test_select_year_element.rb +73 -0
- data/test/fixtures/author.rb +11 -0
- data/test/fixtures/authors.yml +0 -0
- data/test/fixtures/book.rb +14 -0
- data/test/fixtures/books.yml +8 -0
- data/test/fixtures/categories.yml +0 -0
- data/test/fixtures/categorization.rb +2 -0
- data/test/fixtures/categorizations.yml +0 -0
- data/test/fixtures/category.rb +8 -0
- data/test/fixtures/publisher.rb +5 -0
- data/test/fixtures/publishers.yml +10 -0
- data/test/fixtures/schema.rb +43 -0
- data/test/rails/test_model_autodefinition.rb +121 -0
- data/test/rails/test_model_loader.rb +61 -0
- data/test/resources/elements/chunky.rb +11 -0
- data/test/resources/forms/demo.rb +5 -0
- data/test/resources/models/book.rb +8 -0
- data/test/resources/models/register_publisher.rb +5 -0
- data/test/resources/sections/demo.rb +6 -0
- data/test/resources/sections/foo.rb +6 -0
- data/test/resources/validators/foo.rb +9 -0
- data/test/resources/widgets/custom.rb +13 -0
- data/test/test_active_form.rb +1050 -0
- data/test/test_casting.rb +124 -0
- data/test/test_definition.rb +68 -0
- data/test/test_definition_class.rb +118 -0
- data/test/test_element_class.rb +201 -0
- data/test/test_helper.rb +74 -0
- data/test/test_javascript.rb +234 -0
- data/test/test_load_definition.rb +68 -0
- data/test/test_load_element.rb +35 -0
- data/test/test_load_section_element.rb +43 -0
- data/test/test_load_validator.rb +31 -0
- data/test/test_load_widget.rb +93 -0
- data/test/test_validation.rb +722 -0
- data/test/validators/test_validates_as_alpha.rb +26 -0
- data/test/validators/test_validates_as_alphanum.rb +26 -0
- data/test/validators/test_validates_as_digits.rb +26 -0
- data/test/validators/test_validates_as_email.rb +29 -0
- data/test/validators/test_validates_as_number.rb +26 -0
- data/test/validators/test_validates_as_uri.rb +128 -0
- data/test/validators/test_validates_with_format.rb +26 -0
- data/test/validators/test_validates_within_length_range.rb +46 -0
- data/test/validators/test_validates_within_set.rb +46 -0
- data/test/validators/test_validates_within_time_range.rb +53 -0
- metadata +307 -0
- 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 }
|