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.
- 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,34 @@
|
|
|
1
|
+
desc 'Release the website and new gem version'
|
|
2
|
+
task :deploy => [:check_version, :website, :release] do
|
|
3
|
+
puts "Remember to create SVN tag:"
|
|
4
|
+
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
|
5
|
+
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
|
6
|
+
puts "Suggested comment:"
|
|
7
|
+
puts "Tagging release #{CHANGES}"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
|
11
|
+
task :local_deploy => [:website_generate, :install_gem]
|
|
12
|
+
|
|
13
|
+
task :check_version do
|
|
14
|
+
unless ENV['VERSION']
|
|
15
|
+
puts 'Must pass a VERSION=x.y.z release version'
|
|
16
|
+
exit
|
|
17
|
+
end
|
|
18
|
+
unless ENV['VERSION'] == VERS
|
|
19
|
+
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
|
20
|
+
exit
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
|
|
25
|
+
task :install_gem_no_doc => [:clean, :package] do
|
|
26
|
+
sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
namespace :manifest do
|
|
30
|
+
desc 'Recreate Manifest.txt to include ALL files'
|
|
31
|
+
task :refresh do
|
|
32
|
+
`rake check_manifest | patch -p0 > Manifest.txt`
|
|
33
|
+
end
|
|
34
|
+
end
|
data/tasks/website.rake
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
desc 'Generate website files'
|
|
2
|
+
task :website_generate => :ruby_env do
|
|
3
|
+
(Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
|
|
4
|
+
sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
desc 'Upload website files to rubyforge'
|
|
9
|
+
task :website_upload do
|
|
10
|
+
host = "#{rubyforge_username}@rubyforge.org"
|
|
11
|
+
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
|
12
|
+
local_dir = 'website'
|
|
13
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc 'Generate and upload website files'
|
|
17
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
ActiveForm::Element::Base::create :sample_input do
|
|
4
|
+
|
|
5
|
+
def render_element(builder = create_builder)
|
|
6
|
+
builder.input(element_attributes)
|
|
7
|
+
builder.input(element_attributes)
|
|
8
|
+
builder.input(element_attributes)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
ActiveForm::Element::modify :sample_input do
|
|
14
|
+
|
|
15
|
+
def render_element(builder = create_builder)
|
|
16
|
+
builder.textarea(formatted_value, element_attributes)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class TestBaseElement < Test::Unit::TestCase
|
|
22
|
+
|
|
23
|
+
def test_standard_attributes
|
|
24
|
+
assert ActiveForm::Element::Base.element_attribute_names.include?(:title)
|
|
25
|
+
assert ActiveForm::Element::Base.element_attribute_names.include?(:lang)
|
|
26
|
+
elem = ActiveForm::Element::Base.new :elem
|
|
27
|
+
assert elem.respond_to?(:title=)
|
|
28
|
+
assert elem.respond_to?(:style=)
|
|
29
|
+
assert elem.respond_to?(:class=)
|
|
30
|
+
assert elem.respond_to?(:lang=)
|
|
31
|
+
assert_equal Hash.new, elem.attributes
|
|
32
|
+
expected = {"name"=>"elem", "class"=>"elem_base", "id"=>"elem"}
|
|
33
|
+
assert_equal expected, elem.element_attributes
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_set_standard_attributes
|
|
37
|
+
elem = ActiveForm::Element::Base.new :elem, :title => 'My Element', :lang => 'nl-nl', :unknown => 'will be skipped'
|
|
38
|
+
expected = {"title"=>"My Element", "lang"=>"nl-nl"}
|
|
39
|
+
assert_equal expected, elem.attributes
|
|
40
|
+
expected = {"name"=>"elem", "class"=>"elem_base", "title"=>"My Element", "id"=>"elem", "lang"=>"nl-nl"}
|
|
41
|
+
assert_equal expected, elem.element_attributes
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_set_custom_attributes
|
|
45
|
+
elem = ActiveForm::Element::Base.new :elem, :unknown => 'will be skipped'
|
|
46
|
+
expected = {}
|
|
47
|
+
assert_equal expected, elem.attributes
|
|
48
|
+
elem.attributes[:custom] = 'attribute'
|
|
49
|
+
expected = {"custom"=>"attribute"}
|
|
50
|
+
assert_equal expected, elem.attributes
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_standard_option_flags
|
|
54
|
+
elem = ActiveForm::Element::Base.new :elem
|
|
55
|
+
[:frozen, :hidden, :disabled, :readonly, :required].each do |method|
|
|
56
|
+
assert ActiveForm::Element::Base.element_option_flag_names.include?(method)
|
|
57
|
+
assert elem.respond_to?("#{method}")
|
|
58
|
+
assert elem.respond_to?("#{method}=")
|
|
59
|
+
assert elem.respond_to?("#{method}?")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_option_flags_in_css_class
|
|
64
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :readonly => true, :required => true
|
|
65
|
+
elem.css_class += "special"
|
|
66
|
+
assert_equal "elem_base special", elem.css_class.to_s
|
|
67
|
+
assert_equal "frozen hidden disabled readonly required", elem.runtime_css_class.to_s
|
|
68
|
+
assert_equal "elem_base special frozen hidden disabled readonly required", elem.css
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_option_flags_in_css_style
|
|
72
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :required => true
|
|
73
|
+
assert_equal "", elem.css_style.to_s
|
|
74
|
+
assert_equal "display: none", elem.style
|
|
75
|
+
assert_equal elem.runtime_css_style.to_s, elem.style
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_label_css
|
|
79
|
+
elem = ActiveForm::Element::Base.new :elem, :hidden => true
|
|
80
|
+
assert_equal "hidden", elem.label_css
|
|
81
|
+
elem = ActiveForm::Element::Base.new :elem, :hidden => true, :required => true
|
|
82
|
+
assert_equal "hidden required", elem.label_css
|
|
83
|
+
[:frozen, :readonly, :disabled].each do |flag|
|
|
84
|
+
elem = ActiveForm::Element::Base.new :elem, flag => true
|
|
85
|
+
assert_equal "inactive", elem.label_css
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_frozen_flag_inheritance
|
|
90
|
+
form = ActiveForm::compose :form
|
|
91
|
+
elem = form.text_element :elem
|
|
92
|
+
section = form.section :section, :frozen => true
|
|
93
|
+
nested = section.text_element :nested
|
|
94
|
+
assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
|
|
95
|
+
elem.frozen = true
|
|
96
|
+
assert !form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
|
|
97
|
+
elem.frozen = false
|
|
98
|
+
assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
|
|
99
|
+
form.frozen = true
|
|
100
|
+
assert form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_render_label
|
|
104
|
+
elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
|
|
105
|
+
assert elem.labelled?
|
|
106
|
+
assert_equal %|<label for="elem">My Element</label>\n|, elem.render_label
|
|
107
|
+
elem.hidden = true
|
|
108
|
+
assert_equal %|<label class="hidden" for="elem">My Element</label>\n|, elem.render_label
|
|
109
|
+
elem.hidden = false; elem.required = true; elem.frozen = true
|
|
110
|
+
assert_equal %|<label class="inactive required" for="elem">My Element</label>\n|, elem.render_label
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_frozen_element
|
|
114
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
|
115
|
+
assert elem.frozen?
|
|
116
|
+
assert_equal "elem_base", elem.css_class.to_s
|
|
117
|
+
assert_equal "frozen", elem.runtime_css_class.to_s
|
|
118
|
+
assert_equal "elem_base frozen", elem.css
|
|
119
|
+
assert_equal %|<label class="inactive" for="elem">Elem</label>\n|, elem.render_label
|
|
120
|
+
elem.frozen = false
|
|
121
|
+
assert !elem.frozen?
|
|
122
|
+
assert_equal "elem_base", elem.css
|
|
123
|
+
assert_equal %|<label for="elem">Elem</label>\n|, elem.render_label
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_render_input
|
|
127
|
+
elem = ActiveForm::Element::Base.new :elem
|
|
128
|
+
assert_equal elem.render_element, elem.render_input
|
|
129
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
|
130
|
+
assert elem.frozen?
|
|
131
|
+
assert_equal elem.render_frozen, elem.render_input
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_element_to_html
|
|
135
|
+
elem = ActiveForm::Element::Base.new :elem
|
|
136
|
+
expected = %|<span class="elem_base" id="elem">Elem</span>\n|
|
|
137
|
+
assert_equal expected, elem.to_html
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_to_label
|
|
141
|
+
elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
|
|
142
|
+
assert_equal elem.render_label, elem.to_label
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_to_input
|
|
146
|
+
elem = ActiveForm::Element::Base.new :elem
|
|
147
|
+
assert_equal elem.render_element, elem.to_input
|
|
148
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
|
149
|
+
assert elem.frozen?
|
|
150
|
+
assert_equal elem.render_frozen, elem.to_input
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def test_modified_element_class_definition
|
|
154
|
+
elem = ActiveForm::Element::SampleInput.new :elem, :value => 'Some text...'
|
|
155
|
+
expected = %|<textarea class="elem_sample_input" id="elem" name="elem">Some text...</textarea>\n|
|
|
156
|
+
assert_equal expected, elem.to_html
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
ActiveForm::Element::Builder::create :some_snippet do |builder, elem|
|
|
4
|
+
|
|
5
|
+
builder.h1('A preset element')
|
|
6
|
+
builder.p('Just an example of what you can do...')
|
|
7
|
+
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class TestBuilderElement < Test::Unit::TestCase
|
|
11
|
+
|
|
12
|
+
def test_element_to_html
|
|
13
|
+
elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string'
|
|
14
|
+
assert_equal %|raw html string\n|, elem.to_html
|
|
15
|
+
|
|
16
|
+
elem = ActiveForm::Element::Builder.new :elem do |builder, e|
|
|
17
|
+
builder.div('built with block')
|
|
18
|
+
end
|
|
19
|
+
assert_equal %|<div>built with block</div>\n|, elem.to_html
|
|
20
|
+
|
|
21
|
+
elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string and builder block' do |builder, e|
|
|
22
|
+
builder.div(e.value)
|
|
23
|
+
end
|
|
24
|
+
assert_equal %|<div>raw html string and builder block</div>\n|, elem.to_html
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_build_html
|
|
28
|
+
form = ActiveForm::compose :form do |f|
|
|
29
|
+
f.html :named do |builder, e|
|
|
30
|
+
builder.h1('My Pretty form')
|
|
31
|
+
builder.dl {
|
|
32
|
+
e.container.get_elements_of_type(:text).each do |e|
|
|
33
|
+
builder.dt(e.label)
|
|
34
|
+
builder.dd(e.value)
|
|
35
|
+
end
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
f.text_element :name
|
|
39
|
+
f.text_element :city
|
|
40
|
+
f.html { |builder, e| builder.hr }
|
|
41
|
+
end
|
|
42
|
+
form.values = { :name => 'Fred', :city => 'Bedrock' }
|
|
43
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
|
44
|
+
<h1>My Pretty form</h1>
|
|
45
|
+
<dl>
|
|
46
|
+
<dt>Name</dt>
|
|
47
|
+
<dd>Fred</dd>
|
|
48
|
+
<dt>City</dt>
|
|
49
|
+
<dd>Bedrock</dd>
|
|
50
|
+
</dl>
|
|
51
|
+
<input class="elem_text" id="form_name" name="form[name]" size="30" type="text" value="Fred"/>
|
|
52
|
+
<input class="elem_text" id="form_city" name="form[city]" size="30" type="text" value="Bedrock"/>
|
|
53
|
+
<hr/>
|
|
54
|
+
</form>\n|
|
|
55
|
+
assert_equal expected, form.to_html
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_add_raw_string
|
|
59
|
+
form = ActiveForm::compose :form
|
|
60
|
+
form << '<h1>My Form</h1>'
|
|
61
|
+
form.text_element :name
|
|
62
|
+
form << '<hr />'
|
|
63
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
|
64
|
+
<h1>My Form</h1>
|
|
65
|
+
<input class="elem_text" id="form_name" name="form[name]" size="30" type="text"/>
|
|
66
|
+
<hr />
|
|
67
|
+
</form>\n|
|
|
68
|
+
assert_equal expected, form.to_html
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_add_predefined_html_snippet_element
|
|
72
|
+
form = ActiveForm::compose :form
|
|
73
|
+
form.some_snippet_element
|
|
74
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
|
75
|
+
<h1>A preset element</h1>
|
|
76
|
+
<p>Just an example of what you can do...</p>
|
|
77
|
+
</form>\n|
|
|
78
|
+
assert_equal expected, form.to_html
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TestButtonElement < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_element_to_html
|
|
6
|
+
elem = ActiveForm::Element::Button.new :elem, :label => 'Do it!'
|
|
7
|
+
assert !elem.labelled?
|
|
8
|
+
expected = %|<input class="elem_button" id="elem" name="elem" type="button" value="Do it!"/>\n|
|
|
9
|
+
assert_equal expected, elem.to_html
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TestCheckboxElement < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_standard_values
|
|
6
|
+
elem = ActiveForm::Element::Checkbox.new :elem
|
|
7
|
+
assert_equal nil, elem.fallback_value
|
|
8
|
+
assert_equal 1, elem.checked_value
|
|
9
|
+
assert_equal nil, elem.export_value
|
|
10
|
+
elem.checked = true
|
|
11
|
+
assert_equal 1, elem.export_value
|
|
12
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="1"/>\n|
|
|
13
|
+
assert_equal expected, elem.to_html
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_element_to_html
|
|
17
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
|
18
|
+
assert !elem.checked?
|
|
19
|
+
assert_equal nil, elem.value
|
|
20
|
+
expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
|
21
|
+
assert_equal expected, elem.to_html
|
|
22
|
+
|
|
23
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes', :checked => true
|
|
24
|
+
assert elem.checked?
|
|
25
|
+
assert_equal 'yes', elem.value
|
|
26
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
|
27
|
+
assert_equal expected, elem.to_html
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_set_options
|
|
31
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
|
32
|
+
assert !elem.checked?
|
|
33
|
+
expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
|
34
|
+
assert_equal expected, elem.to_html
|
|
35
|
+
|
|
36
|
+
elem.value = 'yes'
|
|
37
|
+
assert elem.checked?
|
|
38
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
|
39
|
+
assert_equal expected, elem.to_html
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_unknown_value
|
|
43
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
|
44
|
+
elem.value = 'unknown'
|
|
45
|
+
assert !elem.checked?
|
|
46
|
+
assert_equal nil, elem.element_value
|
|
47
|
+
|
|
48
|
+
elem.value = 'yes'
|
|
49
|
+
assert elem.checked?
|
|
50
|
+
assert_equal 'yes', elem.element_value
|
|
51
|
+
|
|
52
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
|
53
|
+
elem.value = 'unknown'
|
|
54
|
+
assert !elem.checked?
|
|
55
|
+
assert_equal 'no', elem.element_value
|
|
56
|
+
|
|
57
|
+
elem.value = 'yes'
|
|
58
|
+
assert elem.checked?
|
|
59
|
+
assert_equal 'yes', elem.element_value
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_set_checked
|
|
63
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no'], :checked => true
|
|
64
|
+
assert elem.checked?
|
|
65
|
+
assert_equal 'yes', elem.checked_value
|
|
66
|
+
assert_equal 'no', elem.fallback_value
|
|
67
|
+
assert_equal 'yes', elem.export_value
|
|
68
|
+
assert_equal 'yes', elem.element_value
|
|
69
|
+
|
|
70
|
+
elem.checked = false
|
|
71
|
+
assert !elem.checked?
|
|
72
|
+
assert_equal 'yes', elem.checked_value
|
|
73
|
+
assert_equal 'no', elem.fallback_value
|
|
74
|
+
assert_equal 'no', elem.export_value
|
|
75
|
+
assert_equal 'no', elem.element_value
|
|
76
|
+
|
|
77
|
+
elem.checked = true
|
|
78
|
+
assert elem.checked?
|
|
79
|
+
assert_equal 'yes', elem.checked_value
|
|
80
|
+
assert_equal 'no', elem.fallback_value
|
|
81
|
+
assert_equal 'yes', elem.export_value
|
|
82
|
+
assert_equal 'yes', elem.element_value
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_on_off_value
|
|
86
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
|
87
|
+
assert !elem.checked?
|
|
88
|
+
assert_equal 'yes', elem.checked_value
|
|
89
|
+
assert_equal 'no', elem.fallback_value
|
|
90
|
+
assert_equal 'no', elem.export_value
|
|
91
|
+
assert_equal 'no', elem.element_value
|
|
92
|
+
|
|
93
|
+
elem.update_from_params('yes')
|
|
94
|
+
assert elem.checked?
|
|
95
|
+
assert_equal 'yes', elem.element_value
|
|
96
|
+
|
|
97
|
+
elem.update_from_params('no')
|
|
98
|
+
assert !elem.checked?
|
|
99
|
+
assert_equal 'no', elem.element_value
|
|
100
|
+
|
|
101
|
+
elem.update_from_params(nil)
|
|
102
|
+
assert !elem.checked?
|
|
103
|
+
assert_equal 'no', elem.element_value
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_update_from_params
|
|
107
|
+
form = ActiveForm::compose :myform do |f|
|
|
108
|
+
f.text_element :first_name
|
|
109
|
+
f.text_element :last_name
|
|
110
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :value => 'yes'
|
|
111
|
+
f.submit_element :send
|
|
112
|
+
end
|
|
113
|
+
assert form[:confirm].checked?
|
|
114
|
+
|
|
115
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' } }
|
|
116
|
+
form.update_from_params(params)
|
|
117
|
+
assert form[:confirm].checked?
|
|
118
|
+
|
|
119
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'no' } }
|
|
120
|
+
form.update_from_params(params)
|
|
121
|
+
assert !form[:confirm].checked?
|
|
122
|
+
form[:confirm].checked = true
|
|
123
|
+
|
|
124
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
|
|
125
|
+
form.update_from_params(params)
|
|
126
|
+
assert !form[:confirm].checked?
|
|
127
|
+
form[:confirm].checked = true
|
|
128
|
+
|
|
129
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
|
|
130
|
+
form.update_from_params(params)
|
|
131
|
+
assert !form[:confirm].checked?
|
|
132
|
+
form[:confirm].checked = true
|
|
133
|
+
|
|
134
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone' } }
|
|
135
|
+
form.update_from_params(params)
|
|
136
|
+
assert !form[:confirm].checked?
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_if_checked
|
|
140
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
|
141
|
+
assert_equal 'yes', elem.checked_value
|
|
142
|
+
assert_equal nil, elem.fallback_value
|
|
143
|
+
assert_equal nil, elem.export_value
|
|
144
|
+
assert_equal nil, elem.element_value
|
|
145
|
+
assert !elem.active?
|
|
146
|
+
assert !elem.checked?
|
|
147
|
+
assert !elem.selected?
|
|
148
|
+
|
|
149
|
+
elem.update_from_params('yes')
|
|
150
|
+
assert elem.active?
|
|
151
|
+
assert elem.checked?
|
|
152
|
+
assert elem.selected?
|
|
153
|
+
assert_equal 'yes', elem.element_value
|
|
154
|
+
|
|
155
|
+
elem.update_from_params('no')
|
|
156
|
+
assert !elem.checked?
|
|
157
|
+
assert_equal nil, elem.element_value
|
|
158
|
+
|
|
159
|
+
elem.update_from_params(nil)
|
|
160
|
+
assert !elem.checked?
|
|
161
|
+
assert_equal nil, elem.element_value
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_required_validation
|
|
165
|
+
form = ActiveForm::compose :myform do |f|
|
|
166
|
+
f.text_element :first_name
|
|
167
|
+
f.text_element :last_name
|
|
168
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
|
|
169
|
+
f.submit_element :send
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
assert_equal 0, form[:confirm].element_errors.length
|
|
173
|
+
assert_equal '', form[:confirm].validation_advice
|
|
174
|
+
|
|
175
|
+
validator = form[:confirm].validators.detect { |v| v.code == 'required' }
|
|
176
|
+
assert_kind_of ActiveForm::Validator::Proc, validator
|
|
177
|
+
assert !form.validate
|
|
178
|
+
expected = %|<div class="validation-advice advice-confirm" id="advice-validate-confirm-myform_confirm">Confirm: validation failed</div>\n|
|
|
179
|
+
assert_equal expected, form[:confirm].validation_advice
|
|
180
|
+
|
|
181
|
+
form[:confirm].value = 'no'
|
|
182
|
+
assert !form.validate
|
|
183
|
+
assert_equal expected, form[:confirm].validation_advice
|
|
184
|
+
|
|
185
|
+
form[:confirm].value = 'yes'
|
|
186
|
+
assert form.validate
|
|
187
|
+
assert_equal '', form[:confirm].validation_advice
|
|
188
|
+
|
|
189
|
+
form[:confirm].required_message = 'you need to confirm this'
|
|
190
|
+
assert_equal 'you need to confirm this', validator.message
|
|
191
|
+
|
|
192
|
+
form[:confirm].required = false
|
|
193
|
+
validator = form[:confirm].validators.detect { |v| v.code == 'required' }
|
|
194
|
+
assert_equal nil, validator
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def test_set_values_beforehand
|
|
198
|
+
person = { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' }
|
|
199
|
+
|
|
200
|
+
form = ActiveForm::compose :myform, :values => person do |f|
|
|
201
|
+
f.text_element :first_name, :required => true
|
|
202
|
+
f.text_element :last_name, :required => true
|
|
203
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
|
|
204
|
+
f.submit_element :send
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
assert form[:confirm].checked?
|
|
208
|
+
expected = %|<input checked="checked" class="elem_checkbox required" id="myform_confirm" name="myform[confirm]" type="checkbox" value="yes"/>\n|
|
|
209
|
+
assert_equal expected, form[:confirm].to_html
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_add_multiple_radio_elements
|
|
213
|
+
form = ActiveForm::compose :myform do |f|
|
|
214
|
+
f.checkbox_element :elem_a, :option => 'A', :group => :choice
|
|
215
|
+
f.checkbox_element :elem_b, :option => 'B', :group => :choice, :checked => true
|
|
216
|
+
end
|
|
217
|
+
assert !form[:elem_a].checked?
|
|
218
|
+
assert form[:elem_b].checked?
|
|
219
|
+
|
|
220
|
+
assert_equal 'A', form[:elem_a].checked_value
|
|
221
|
+
assert_equal 'B', form[:elem_b].checked_value
|
|
222
|
+
|
|
223
|
+
assert_equal 'myform[choice][]', form[:elem_a].element_name
|
|
224
|
+
assert_equal 'myform[choice][]', form[:elem_b].element_name
|
|
225
|
+
|
|
226
|
+
assert_equal 'myform_elem_a', form[:elem_a].identifier
|
|
227
|
+
assert_equal 'myform_elem_b', form[:elem_b].identifier
|
|
228
|
+
|
|
229
|
+
expected = { "choice" => ["B"] }
|
|
230
|
+
assert_equal expected, form.export_values
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
end
|