formtastic 2.0.0.rc4 → 2.0.0.rc5
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/CHANGELOG +6 -0
- data/RELEASE_PROCESS +1 -1
- data/lib/formtastic/form_builder.rb +2 -2
- data/lib/formtastic/helpers/form_helper.rb +3 -3
- data/lib/formtastic/helpers/input_helper.rb +16 -14
- data/lib/formtastic/inputs/base/choices.rb +8 -8
- data/lib/formtastic/inputs/check_boxes_input.rb +33 -26
- data/lib/formtastic/version.rb +1 -1
- data/lib/generators/templates/formtastic.rb +3 -3
- data/spec/builder/custom_builder_spec.rb +7 -0
- data/spec/inputs/boolean_input_spec.rb +15 -9
- data/spec/inputs/check_boxes_input_spec.rb +19 -0
- data/spec/inputs/country_input_spec.rb +3 -3
- data/spec/inputs/date_input_spec.rb +6 -4
- data/spec/inputs/datetime_input_spec.rb +6 -4
- data/spec/inputs/email_input_spec.rb +6 -4
- data/spec/inputs/file_input_spec.rb +6 -4
- data/spec/inputs/number_input_spec.rb +6 -4
- data/spec/inputs/password_input_spec.rb +6 -4
- data/spec/inputs/phone_input_spec.rb +6 -4
- data/spec/inputs/search_input_spec.rb +6 -4
- data/spec/inputs/select_input_spec.rb +6 -4
- data/spec/inputs/text_input_spec.rb +6 -4
- data/spec/inputs/time_input_spec.rb +6 -4
- data/spec/inputs/time_zone_input_spec.rb +6 -4
- data/spec/inputs/url_input_spec.rb +6 -4
- metadata +4 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
2.0.0.rc5
|
2
|
+
|
3
|
+
* Changed perform_browser_validations and use_required_attribute configuration defaults from true to false for a better out-of-the-box experience and upgrade path
|
4
|
+
* Fixed that the `novalidate` attribute was being applied to the `<form>` tag when it shouldn't have been (and vice-versa)
|
5
|
+
* Fixed `undefined method `last' for #<Classname>` with a `:collection` containing an array of arrays
|
6
|
+
|
1
7
|
2.0.0.rc4
|
2
8
|
|
3
9
|
* Fixed that TimeInput was not rendering hidden y/m/d inputs by default.
|
data/RELEASE_PROCESS
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# edit version.rb
|
2
|
-
git ci
|
2
|
+
git ci -am "version bump" # commit changes
|
3
3
|
git tag X.X.X # tag the new version in the code base too
|
4
4
|
gem build formtastic.gemspec # build the gem
|
5
5
|
gem push formtastic-X.X.X.gem # publish the gem
|
@@ -28,8 +28,8 @@ module Formtastic
|
|
28
28
|
configure :default_inline_error_class, 'inline-errors'
|
29
29
|
configure :default_error_list_class, 'errors'
|
30
30
|
configure :default_hint_class, 'inline-hints'
|
31
|
-
configure :use_required_attribute,
|
32
|
-
configure :perform_browser_validations,
|
31
|
+
configure :use_required_attribute, false
|
32
|
+
configure :perform_browser_validations, false
|
33
33
|
|
34
34
|
attr_reader :template
|
35
35
|
|
@@ -143,7 +143,7 @@ module Formtastic
|
|
143
143
|
options = args.extract_options!
|
144
144
|
options[:builder] ||= @@builder
|
145
145
|
options[:html] ||= {}
|
146
|
-
options[:html][:novalidate] =
|
146
|
+
options[:html][:novalidate] = !@@builder.perform_browser_validations unless options[:html].key?(:novalidate)
|
147
147
|
@@builder.custom_namespace = options[:namespace].to_s
|
148
148
|
|
149
149
|
singularizer = defined?(ActiveModel::Naming.singular) ? ActiveModel::Naming.method(:singular) : ActionController::RecordIdentifier.method(:singular_class_name)
|
@@ -175,7 +175,7 @@ module Formtastic
|
|
175
175
|
self.fields_for(record_name, record_object, options, &block)
|
176
176
|
end
|
177
177
|
end
|
178
|
-
|
178
|
+
|
179
179
|
protected
|
180
180
|
|
181
181
|
# Override the default ActiveRecordHelper behaviour of wrapping the input.
|
@@ -197,4 +197,4 @@ module Formtastic
|
|
197
197
|
|
198
198
|
end
|
199
199
|
end
|
200
|
-
end
|
200
|
+
end
|
@@ -1,12 +1,13 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
module Formtastic
|
2
3
|
module Helpers
|
3
|
-
|
4
|
-
# {#input} is used to render all content (labels, form widgets, error messages, hints, etc) for
|
5
|
-
# a single form input (or field), usually representing a single method or attribute on the
|
4
|
+
|
5
|
+
# {#input} is used to render all content (labels, form widgets, error messages, hints, etc) for
|
6
|
+
# a single form input (or field), usually representing a single method or attribute on the
|
6
7
|
# form's object or model.
|
7
8
|
#
|
8
|
-
# The content is wrapped in an `<li>` tag, so it's usually called inside an {Formtastic::Helpers::InputsHelper#inputs inputs} block
|
9
|
-
# (which renders an `<ol>` inside a `<fieldset>`), which should be inside a {Formtastic::Helpers::FormHelper#semantic_form_for `semantic_form_for`}
|
9
|
+
# The content is wrapped in an `<li>` tag, so it's usually called inside an {Formtastic::Helpers::InputsHelper#inputs inputs} block
|
10
|
+
# (which renders an `<ol>` inside a `<fieldset>`), which should be inside a {Formtastic::Helpers::FormHelper#semantic_form_for `semantic_form_for`}
|
10
11
|
# block:
|
11
12
|
#
|
12
13
|
# <%= semantic_form_for @post do |f| %>
|
@@ -37,7 +38,7 @@ module Formtastic
|
|
37
38
|
module InputHelper
|
38
39
|
include Formtastic::Helpers::Reflection
|
39
40
|
include Formtastic::Helpers::FileColumnDetection
|
40
|
-
|
41
|
+
|
41
42
|
# Returns a chunk of HTML markup for a given `method` on the form object, wrapped in
|
42
43
|
# an `<li>` wrapper tag with appropriate `class` and `id` attribute hooks for CSS and JS.
|
43
44
|
# In many cases, the contents of the wrapper will be as simple as a `<label>` and an `<input>`:
|
@@ -105,9 +106,9 @@ module Formtastic
|
|
105
106
|
# * `:time` (see {Inputs::TimeInput})
|
106
107
|
# * `:url` (see {Inputs::UrlInput})
|
107
108
|
#
|
108
|
-
# Calling `:as => :string` (for example) will call `#to_html` on a new instance of
|
109
|
+
# Calling `:as => :string` (for example) will call `#to_html` on a new instance of
|
109
110
|
# `Formtastic::Inputs::StringInput`. Before this, Formtastic will try to instantiate a top-level
|
110
|
-
# namespace StringInput, meaning you can subclass and modify `Formtastic::Inputs::StringInput`
|
111
|
+
# namespace StringInput, meaning you can subclass and modify `Formtastic::Inputs::StringInput`
|
111
112
|
# in `app/inputs/`. This also means you can create your own new input types in `app/inputs/`.
|
112
113
|
#
|
113
114
|
# @todo document the "guessing" of input style
|
@@ -233,7 +234,7 @@ module Formtastic
|
|
233
234
|
# @example Modifying an input to suit your needs in `app/inputs`:
|
234
235
|
# class StringInput < Formtastic::Inputs::StringInput
|
235
236
|
# def to_html
|
236
|
-
# puts "this is my custom version of StringInput"
|
237
|
+
# puts "this is my custom version of StringInput"
|
237
238
|
# super
|
238
239
|
# end
|
239
240
|
# end
|
@@ -260,13 +261,14 @@ module Formtastic
|
|
260
261
|
def input(method, options = {})
|
261
262
|
options = options.dup # Allow options to be shared without being tainted by Formtastic
|
262
263
|
options[:as] ||= default_input_type(method, options)
|
263
|
-
|
264
|
+
|
264
265
|
klass = input_class(options[:as])
|
266
|
+
|
265
267
|
klass.new(self, template, @object, @object_name, method, options).to_html
|
266
268
|
end
|
267
|
-
|
269
|
+
|
268
270
|
protected
|
269
|
-
|
271
|
+
|
270
272
|
# First try if we can detect special things like :file. With CarrierWave the method does have
|
271
273
|
# an underlying column so we don't want :string to get selected.
|
272
274
|
#
|
@@ -314,7 +316,7 @@ module Formtastic
|
|
314
316
|
return :string
|
315
317
|
end
|
316
318
|
end
|
317
|
-
|
319
|
+
|
318
320
|
# Get a column object for a specified attribute method - if possible.
|
319
321
|
def column_for(method) #:nodoc:
|
320
322
|
@object.column_for_attribute(method) if @object.respond_to?(:column_for_attribute)
|
@@ -352,7 +354,7 @@ module Formtastic
|
|
352
354
|
end
|
353
355
|
end
|
354
356
|
end
|
355
|
-
|
357
|
+
|
356
358
|
# :as => :string # => StringInput
|
357
359
|
def custom_input_class_name(as)
|
358
360
|
"#{as.to_s.camelize}Input"
|
@@ -2,9 +2,9 @@ module Formtastic
|
|
2
2
|
module Inputs
|
3
3
|
module Base
|
4
4
|
module Choices
|
5
|
-
|
5
|
+
|
6
6
|
def choices_wrapping(&block)
|
7
|
-
template.content_tag(:fieldset,
|
7
|
+
template.content_tag(:fieldset,
|
8
8
|
template.capture(&block),
|
9
9
|
choices_wrapping_html_options
|
10
10
|
)
|
@@ -15,7 +15,7 @@ module Formtastic
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def choices_group_wrapping(&block)
|
18
|
-
template.content_tag(:ol,
|
18
|
+
template.content_tag(:ol,
|
19
19
|
template.capture(&block),
|
20
20
|
choices_group_wrapping_html_options
|
21
21
|
)
|
@@ -26,7 +26,7 @@ module Formtastic
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def choice_wrapping(html_options, &block)
|
29
|
-
template.content_tag(:li,
|
29
|
+
template.content_tag(:li,
|
30
30
|
template.capture(&block),
|
31
31
|
html_options
|
32
32
|
)
|
@@ -35,11 +35,11 @@ module Formtastic
|
|
35
35
|
def choice_wrapping_html_options(choice)
|
36
36
|
classes = ['choice']
|
37
37
|
classes << "#{sanitized_method_name.singularize}_#{choice_html_safe_value(choice)}" if value_as_class?
|
38
|
-
|
38
|
+
|
39
39
|
{ :class => classes.join(" ") }
|
40
40
|
end
|
41
41
|
|
42
|
-
def choice_html(choice)
|
42
|
+
def choice_html(choice)
|
43
43
|
raise "choice_html() needs to be implemented when including Formtastic::Inputs::Base::Choices"
|
44
44
|
end
|
45
45
|
|
@@ -75,7 +75,7 @@ module Formtastic
|
|
75
75
|
choice_html_safe_value(choice)
|
76
76
|
].compact.reject { |i| i.blank? }.join("_")
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def value_as_class?
|
80
80
|
options[:value_as_class]
|
81
81
|
end
|
@@ -90,7 +90,7 @@ module Formtastic
|
|
90
90
|
"".html_safe
|
91
91
|
end
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
# Override to remove the for attribute since this isn't associated with any element, as it's
|
95
95
|
# nested inside the legend.
|
96
96
|
def label_html_options
|
@@ -81,14 +81,14 @@ module Formtastic
|
|
81
81
|
include Base
|
82
82
|
include Base::Collections
|
83
83
|
include Base::Choices
|
84
|
-
|
84
|
+
|
85
85
|
def to_html
|
86
86
|
input_wrapping do
|
87
87
|
choices_wrapping do
|
88
88
|
legend_html <<
|
89
89
|
hidden_field_for_all <<
|
90
90
|
choices_group_wrapping do
|
91
|
-
collection.map { |choice|
|
91
|
+
collection.map { |choice|
|
92
92
|
choice_wrapping(choice_wrapping_html_options(choice)) do
|
93
93
|
choice_html(choice)
|
94
94
|
end
|
@@ -97,17 +97,17 @@ module Formtastic
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
101
|
-
def choice_html(choice)
|
100
|
+
|
101
|
+
def choice_html(choice)
|
102
102
|
template.content_tag(:label,
|
103
|
-
hidden_fields? ?
|
104
|
-
check_box_with_hidden_input(choice) :
|
103
|
+
hidden_fields? ?
|
104
|
+
check_box_with_hidden_input(choice) :
|
105
105
|
check_box_without_hidden_input(choice) <<
|
106
106
|
choice_label(choice),
|
107
107
|
label_html_options.merge(:for => choice_input_dom_id(choice), :class => nil)
|
108
108
|
)
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
def hidden_field_for_all
|
112
112
|
if hidden_fields?
|
113
113
|
""
|
@@ -118,62 +118,69 @@ module Formtastic
|
|
118
118
|
template.hidden_field_tag(input_name, '', options)
|
119
119
|
end
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
def hidden_fields?
|
123
123
|
options[:hidden_fields]
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
def check_box_with_hidden_input(choice)
|
127
127
|
value = choice_value(choice)
|
128
128
|
builder.check_box(
|
129
|
-
association_primary_key || method,
|
130
|
-
input_html_options.merge(:id => choice_input_dom_id(choice), :name => input_name, :disabled => disabled?(value), :required => false),
|
131
|
-
value,
|
129
|
+
association_primary_key || method,
|
130
|
+
input_html_options.merge(:id => choice_input_dom_id(choice), :name => input_name, :disabled => disabled?(value), :required => false),
|
131
|
+
value,
|
132
132
|
unchecked_value
|
133
133
|
)
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
def check_box_without_hidden_input(choice)
|
137
137
|
value = choice_value(choice)
|
138
138
|
template.check_box_tag(
|
139
|
-
input_name,
|
140
|
-
value,
|
141
|
-
checked?(value),
|
139
|
+
input_name,
|
140
|
+
value,
|
141
|
+
checked?(value),
|
142
142
|
input_html_options.merge(:id => choice_input_dom_id(choice), :disabled => disabled?(value), :required => false)
|
143
|
-
)
|
143
|
+
)
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
def checked?(value)
|
147
147
|
selected_values.include?(value)
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
def disabled?(value)
|
151
151
|
disabled_values.include?(value)
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
def selected_values
|
155
155
|
if object.respond_to?(method)
|
156
|
-
|
156
|
+
if options[:collection].is_a?(Array) and
|
157
|
+
options[:collection].flatten.all? {|i| i.is_a?(String) or i.is_a?(Integer)}
|
158
|
+
|
159
|
+
selected_items = options[:collection]
|
160
|
+
else
|
161
|
+
selected_items = [object.send(method)].compact.flatten
|
162
|
+
end
|
163
|
+
|
157
164
|
[*selected_items.map { |o| send_or_call_or_object(value_method, o) }].compact
|
158
165
|
else
|
159
166
|
[]
|
160
167
|
end
|
161
168
|
end
|
162
|
-
|
169
|
+
|
163
170
|
def disabled_values
|
164
171
|
vals = options[:disabled] || []
|
165
172
|
vals = [vals] unless vals.is_a?(Array)
|
166
173
|
vals
|
167
174
|
end
|
168
|
-
|
175
|
+
|
169
176
|
def unchecked_value
|
170
177
|
options[:unchecked_value] || ''
|
171
178
|
end
|
172
|
-
|
179
|
+
|
173
180
|
def input_name
|
174
181
|
"#{object_name}[#{association_primary_key || method}][]"
|
175
182
|
end
|
176
|
-
|
183
|
+
|
177
184
|
end
|
178
185
|
end
|
179
|
-
end
|
186
|
+
end
|
data/lib/formtastic/version.rb
CHANGED
@@ -72,11 +72,11 @@
|
|
72
72
|
# specifying that class here. Defaults to Formtastic::FormBuilder.
|
73
73
|
# Formtastic::Helpers::FormHelper.builder = MyCustomBuilder
|
74
74
|
|
75
|
-
# You can opt
|
75
|
+
# You can opt-in to Formtastic's use of the HTML5 `required` attribute on `<input>`, `<select>`
|
76
76
|
# and `<textarea>` tags by setting this to false (defaults to true).
|
77
|
-
# Formtastic::FormBuilder.use_required_attribute =
|
77
|
+
# Formtastic::FormBuilder.use_required_attribute = true
|
78
78
|
|
79
|
-
# You can opt
|
79
|
+
# You can opt-in to new HTML5 browser validations (for things like email and url inputs) by setting
|
80
80
|
# this to false. Doing so will add a `novalidate` attribute to the `<form>` tag.
|
81
81
|
# See http://diveintohtml5.org/forms.html#validation for more info.
|
82
82
|
# Formtastic::FormBuilder.perform_browser_validations = true
|
@@ -70,6 +70,13 @@ describe 'Formtastic::Helpers::FormHelper.builder' do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
# See: https://github.com/justinfrench/formtastic/issues/657
|
74
|
+
it "should not conflict with navigasmic" do
|
75
|
+
stub!(:builder).and_return('navigasmic')
|
76
|
+
|
77
|
+
lambda { semantic_form_for(@new_post) }.should_not raise_error(NoMethodError)
|
78
|
+
end
|
79
|
+
|
73
80
|
end
|
74
81
|
|
75
82
|
describe "fields_for" do
|
@@ -150,19 +150,25 @@ describe 'boolean input' do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
context "when required" do
|
153
|
+
|
153
154
|
it "should add the required attribute to the input's html options" do
|
154
|
-
|
155
|
-
concat(
|
156
|
-
|
157
|
-
|
155
|
+
with_config :use_required_attribute, true do
|
156
|
+
concat(semantic_form_for(@new_post) do |builder|
|
157
|
+
concat(builder.input(:title, :as => :boolean, :required => true))
|
158
|
+
end)
|
159
|
+
output_buffer.should have_tag("input[@required]")
|
160
|
+
end
|
158
161
|
end
|
159
|
-
|
162
|
+
|
160
163
|
it "should not add the required attribute to the boolean fields input's html options" do
|
161
|
-
|
162
|
-
concat(
|
163
|
-
|
164
|
-
|
164
|
+
with_config :use_required_attribute, true do
|
165
|
+
concat(semantic_form_for(@new_post) do |builder|
|
166
|
+
concat(builder.input(:title, :as => :boolean))
|
167
|
+
end)
|
168
|
+
output_buffer.should_not have_tag("input[@required]")
|
169
|
+
end
|
165
170
|
end
|
171
|
+
|
166
172
|
end
|
167
173
|
|
168
174
|
describe "when namespace is provided" do
|
@@ -393,5 +393,24 @@ describe 'check_boxes input' do
|
|
393
393
|
it_should_have_input_wrapper_with_id("context2_author_posts_input")
|
394
394
|
end
|
395
395
|
|
396
|
+
describe "when collection is an array" do
|
397
|
+
before do
|
398
|
+
@output_buffer = ''
|
399
|
+
@_collection = [["First", 1], ["Second", 2]]
|
400
|
+
mock_everything
|
401
|
+
|
402
|
+
concat(semantic_form_for(@fred) do |builder|
|
403
|
+
concat(builder.input(:posts, :as => :check_boxes, :collection => @_collection))
|
404
|
+
end)
|
405
|
+
end
|
406
|
+
|
407
|
+
it "should use array items for labels and values" do
|
408
|
+
@_collection.each do |post|
|
409
|
+
output_buffer.should have_tag('form li fieldset ol li label', /#{post.first}/)
|
410
|
+
output_buffer.should have_tag("form li fieldset ol li label[@for='author_post_ids_#{post.last}']")
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
396
415
|
end
|
397
416
|
|
@@ -56,7 +56,7 @@ describe 'country input' do
|
|
56
56
|
priority_countries = ["Foo", "Bah"]
|
57
57
|
semantic_form_for(@new_post) do |builder|
|
58
58
|
builder.stub!(:country_select).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
59
|
-
builder.should_receive(:country_select).with(:country, priority_countries, {}, {:id => "post_country", :required =>
|
59
|
+
builder.should_receive(:country_select).with(:country, priority_countries, {}, {:id => "post_country", :required => false, :autofocus => false}).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
60
60
|
|
61
61
|
concat(builder.input(:country, :as => :country, :priority_countries => priority_countries))
|
62
62
|
end
|
@@ -69,7 +69,7 @@ describe 'country input' do
|
|
69
69
|
|
70
70
|
semantic_form_for(@new_post) do |builder|
|
71
71
|
builder.stub!(:country_select).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
72
|
-
builder.should_receive(:country_select).with(:country, priority_countries, {}, {:id => "post_country", :required =>
|
72
|
+
builder.should_receive(:country_select).with(:country, priority_countries, {}, {:id => "post_country", :required => false, :autofocus => false}).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
73
73
|
|
74
74
|
concat(builder.input(:country, :as => :country))
|
75
75
|
end
|
@@ -85,7 +85,7 @@ describe 'country input' do
|
|
85
85
|
|
86
86
|
concat(semantic_form_for(@new_post, :namespace => 'context2') do |builder|
|
87
87
|
builder.stub!(:country_select).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
88
|
-
builder.should_receive(:country_select).with(:country, [], {}, {:id => "context2_post_country", :required =>
|
88
|
+
builder.should_receive(:country_select).with(:country, [], {}, {:id => "context2_post_country", :required => false, :autofocus => false}).and_return(Formtastic::Util.html_safe("<select><option>...</option></select>"))
|
89
89
|
concat(builder.input(:country, :priority_countries => []))
|
90
90
|
end)
|
91
91
|
end
|
@@ -120,10 +120,12 @@ describe 'date input' do
|
|
120
120
|
|
121
121
|
describe "when required" do
|
122
122
|
it "should add the required attribute to the input's html options" do
|
123
|
-
|
124
|
-
concat(
|
125
|
-
|
126
|
-
|
123
|
+
with_config :use_required_attribute, true do
|
124
|
+
concat(semantic_form_for(@new_post) do |builder|
|
125
|
+
concat(builder.input(:title, :as => :date, :required => true))
|
126
|
+
end)
|
127
|
+
output_buffer.should have_tag("select[@required]", :count => 3)
|
128
|
+
end
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
@@ -124,10 +124,12 @@ describe 'datetime input' do
|
|
124
124
|
|
125
125
|
describe "when required" do
|
126
126
|
it "should add the required attribute to the input's html options" do
|
127
|
-
|
128
|
-
concat(
|
129
|
-
|
130
|
-
|
127
|
+
with_config :use_required_attribute, true do
|
128
|
+
concat(semantic_form_for(@new_post) do |builder|
|
129
|
+
concat(builder.input(:title, :as => :datetime, :required => true))
|
130
|
+
end)
|
131
|
+
output_buffer.should have_tag("select[@required]", :count => 5)
|
132
|
+
end
|
131
133
|
end
|
132
134
|
end
|
133
135
|
|
@@ -44,10 +44,12 @@ describe 'email input' do
|
|
44
44
|
|
45
45
|
describe "when required" do
|
46
46
|
it "should add the required attribute to the input's html options" do
|
47
|
-
|
48
|
-
concat(
|
49
|
-
|
50
|
-
|
47
|
+
with_config :use_required_attribute, true do
|
48
|
+
concat(semantic_form_for(@new_post) do |builder|
|
49
|
+
concat(builder.input(:title, :as => :email, :required => true))
|
50
|
+
end)
|
51
|
+
output_buffer.should have_tag("input[@required]")
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
@@ -48,10 +48,12 @@ describe 'file input' do
|
|
48
48
|
|
49
49
|
context "when required" do
|
50
50
|
it "should add the required attribute to the input's html options" do
|
51
|
-
|
52
|
-
concat(
|
53
|
-
|
54
|
-
|
51
|
+
with_config :use_required_attribute, true do
|
52
|
+
concat(semantic_form_for(@new_post) do |builder|
|
53
|
+
concat(builder.input(:title, :as => :file, :required => true))
|
54
|
+
end)
|
55
|
+
output_buffer.should have_tag("input[@required]")
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
@@ -68,10 +68,12 @@ describe 'number input' do
|
|
68
68
|
|
69
69
|
describe "when required" do
|
70
70
|
it "should add the required attribute to the input's html options" do
|
71
|
-
|
72
|
-
concat(
|
73
|
-
|
74
|
-
|
71
|
+
with_config :use_required_attribute, true do
|
72
|
+
concat(semantic_form_for(@new_post) do |builder|
|
73
|
+
concat(builder.input(:title, :as => :number, :required => true))
|
74
|
+
end)
|
75
|
+
output_buffer.should have_tag("input[@required]")
|
76
|
+
end
|
75
77
|
end
|
76
78
|
end
|
77
79
|
|
@@ -59,10 +59,12 @@ describe 'password input' do
|
|
59
59
|
|
60
60
|
describe "when required" do
|
61
61
|
it "should add the required attribute to the input's html options" do
|
62
|
-
|
63
|
-
concat(
|
64
|
-
|
65
|
-
|
62
|
+
with_config :use_required_attribute, true do
|
63
|
+
concat(semantic_form_for(@new_post) do |builder|
|
64
|
+
concat(builder.input(:title, :as => :password, :required => true))
|
65
|
+
end)
|
66
|
+
output_buffer.should have_tag("input[@required]")
|
67
|
+
end
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
@@ -44,10 +44,12 @@ describe 'phone input' do
|
|
44
44
|
|
45
45
|
describe "when required" do
|
46
46
|
it "should add the required attribute to the input's html options" do
|
47
|
-
|
48
|
-
concat(
|
49
|
-
|
50
|
-
|
47
|
+
with_config :use_required_attribute, true do
|
48
|
+
concat(semantic_form_for(@new_post) do |builder|
|
49
|
+
concat(builder.input(:title, :as => :phone, :required => true))
|
50
|
+
end)
|
51
|
+
output_buffer.should have_tag("input[@required]")
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
@@ -44,10 +44,12 @@ describe 'search input' do
|
|
44
44
|
|
45
45
|
describe "when required" do
|
46
46
|
it "should add the required attribute to the input's html options" do
|
47
|
-
|
48
|
-
concat(
|
49
|
-
|
50
|
-
|
47
|
+
with_config :use_required_attribute, true do
|
48
|
+
concat(semantic_form_for(@new_post) do |builder|
|
49
|
+
concat(builder.input(:title, :as => :search, :required => true))
|
50
|
+
end)
|
51
|
+
output_buffer.should have_tag("input[@required]")
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
@@ -535,10 +535,12 @@ describe 'select input' do
|
|
535
535
|
|
536
536
|
context "when required" do
|
537
537
|
it "should add the required attribute to the select's html options" do
|
538
|
-
|
539
|
-
concat(
|
540
|
-
|
541
|
-
|
538
|
+
with_config :use_required_attribute, true do
|
539
|
+
concat(semantic_form_for(@new_post) do |builder|
|
540
|
+
concat(builder.input(:author, :as => :select, :required => true))
|
541
|
+
end)
|
542
|
+
output_buffer.should have_tag("select[@required]")
|
543
|
+
end
|
542
544
|
end
|
543
545
|
end
|
544
546
|
|
@@ -83,10 +83,12 @@ describe 'text input' do
|
|
83
83
|
|
84
84
|
context "when required" do
|
85
85
|
it "should add the required attribute to the input's html options" do
|
86
|
-
|
87
|
-
concat(
|
88
|
-
|
89
|
-
|
86
|
+
with_config :use_required_attribute, true do
|
87
|
+
concat(semantic_form_for(@new_post) do |builder|
|
88
|
+
concat(builder.input(:title, :as => :text, :required => true))
|
89
|
+
end)
|
90
|
+
output_buffer.should have_tag("textarea[@required]")
|
91
|
+
end
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
@@ -189,10 +189,12 @@ describe 'time input' do
|
|
189
189
|
|
190
190
|
describe "when required" do
|
191
191
|
it "should add the required attribute to the input's html options" do
|
192
|
-
|
193
|
-
concat(
|
194
|
-
|
195
|
-
|
192
|
+
with_config :use_required_attribute, true do
|
193
|
+
concat(semantic_form_for(@new_post) do |builder|
|
194
|
+
concat(builder.input(:title, :as => :time, :required => true))
|
195
|
+
end)
|
196
|
+
output_buffer.should have_tag("select[@required]", :count => 2)
|
197
|
+
end
|
196
198
|
end
|
197
199
|
end
|
198
200
|
|
@@ -77,10 +77,12 @@ describe 'time_zone input' do
|
|
77
77
|
|
78
78
|
context "when required" do
|
79
79
|
it "should add the required attribute to the input's html options" do
|
80
|
-
|
81
|
-
concat(
|
82
|
-
|
83
|
-
|
80
|
+
with_config :use_required_attribute, true do
|
81
|
+
concat(semantic_form_for(@new_post) do |builder|
|
82
|
+
concat(builder.input(:title, :as => :time_zone, :required => true))
|
83
|
+
end)
|
84
|
+
output_buffer.should have_tag("select[@required]")
|
85
|
+
end
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
@@ -44,10 +44,12 @@ describe 'url input' do
|
|
44
44
|
|
45
45
|
describe "when required" do
|
46
46
|
it "should add the required attribute to the input's html options" do
|
47
|
-
|
48
|
-
concat(
|
49
|
-
|
50
|
-
|
47
|
+
with_config :use_required_attribute, true do
|
48
|
+
concat(semantic_form_for(@new_post) do |builder|
|
49
|
+
concat(builder.input(:title, :as => :url, :required => true))
|
50
|
+
end)
|
51
|
+
output_buffer.should have_tag("input[@required]")
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formtastic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15424095
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 2.0.0.
|
11
|
+
- 5
|
12
|
+
version: 2.0.0.rc5
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Justin French
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-
|
20
|
+
date: 2011-09-01 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: rails
|