formtastic 2.1.1 → 2.2.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +19 -1
  3. data/Appraisals +7 -0
  4. data/CHANGELOG +18 -0
  5. data/README.textile +14 -16
  6. data/formtastic.gemspec +1 -1
  7. data/gemfiles/rails-4.gemfile +8 -0
  8. data/lib/formtastic/form_builder.rb +0 -1
  9. data/lib/formtastic/helpers/input_helper.rb +12 -26
  10. data/lib/formtastic/inputs.rb +6 -0
  11. data/lib/formtastic/inputs/base.rb +16 -4
  12. data/lib/formtastic/inputs/base/datetime_pickerish.rb +85 -0
  13. data/lib/formtastic/inputs/base/stringish.rb +10 -2
  14. data/lib/formtastic/inputs/base/timeish.rb +17 -17
  15. data/lib/formtastic/inputs/base/wrapping.rb +25 -20
  16. data/lib/formtastic/inputs/boolean_input.rb +24 -1
  17. data/lib/formtastic/inputs/date_input.rb +5 -29
  18. data/lib/formtastic/inputs/date_picker_input.rb +93 -0
  19. data/lib/formtastic/inputs/date_select_input.rb +34 -0
  20. data/lib/formtastic/inputs/datetime_input.rb +6 -8
  21. data/lib/formtastic/inputs/datetime_picker_input.rb +100 -0
  22. data/lib/formtastic/inputs/datetime_select_input.rb +12 -0
  23. data/lib/formtastic/inputs/hidden_input.rb +1 -1
  24. data/lib/formtastic/inputs/radio_input.rb +1 -1
  25. data/lib/formtastic/inputs/select_input.rb +2 -5
  26. data/lib/formtastic/inputs/time_input.rb +4 -28
  27. data/lib/formtastic/inputs/time_picker_input.rb +99 -0
  28. data/lib/formtastic/inputs/time_select_input.rb +34 -0
  29. data/lib/formtastic/version.rb +1 -1
  30. data/lib/generators/templates/formtastic.rb +0 -8
  31. data/sample/basic_inputs.html +21 -1
  32. data/spec/builder/semantic_fields_for_spec.rb +1 -1
  33. data/spec/generators/formtastic/install/install_generator_spec.rb +1 -1
  34. data/spec/helpers/input_helper_spec.rb +20 -16
  35. data/spec/helpers/semantic_errors_helper_spec.rb +10 -10
  36. data/spec/inputs/custom_input_spec.rb +5 -2
  37. data/spec/inputs/date_picker_input_spec.rb +449 -0
  38. data/spec/inputs/{date_input_spec.rb → date_select_input_spec.rb} +34 -34
  39. data/spec/inputs/datetime_picker_input_spec.rb +490 -0
  40. data/spec/inputs/{datetime_input_spec.rb → datetime_select_input_spec.rb} +33 -33
  41. data/spec/inputs/deprecated_time_date_datetime_inputs_spec.rb +48 -0
  42. data/spec/inputs/hidden_input_spec.rb +21 -17
  43. data/spec/inputs/include_blank_spec.rb +3 -3
  44. data/spec/inputs/label_spec.rb +1 -1
  45. data/spec/inputs/placeholder_spec.rb +1 -1
  46. data/spec/inputs/select_input_spec.rb +22 -14
  47. data/spec/inputs/time_picker_input_spec.rb +455 -0
  48. data/spec/inputs/{time_input_spec.rb → time_select_input_spec.rb} +35 -35
  49. data/spec/spec_helper.rb +25 -1
  50. data/spec/support/custom_macros.rb +2 -2
  51. metadata +32 -21
  52. data/lib/formtastic/helpers/buttons_helper.rb +0 -310
  53. data/spec/helpers/buttons_helper_spec.rb +0 -166
  54. data/spec/helpers/commit_button_helper_spec.rb +0 -530
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe 'date input' do
4
+ describe 'date select input' do
5
5
 
6
6
  include FormtasticSpecHelper
7
7
 
@@ -15,43 +15,43 @@ describe 'date input' do
15
15
  before do
16
16
  output_buffer.replace ''
17
17
  concat(semantic_form_for(@new_post) do |builder|
18
- concat(builder.input(:publish_at, :as => :date, :order => [:year, :month, :day]))
18
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:year, :month, :day]))
19
19
  end)
20
20
  end
21
21
 
22
- it_should_have_input_wrapper_with_class("date")
22
+ it_should_have_input_wrapper_with_class("date_select")
23
23
  it_should_have_input_wrapper_with_class(:input)
24
24
  it_should_have_input_wrapper_with_id("post_publish_at_input")
25
25
  it_should_have_a_nested_fieldset
26
26
  it_should_have_a_nested_fieldset_with_class('fragments')
27
27
  it_should_have_a_nested_ordered_list_with_class('fragments-group')
28
- it_should_apply_error_logic_for_input_type(:date)
28
+ it_should_apply_error_logic_for_input_type(:date_select)
29
29
 
30
30
  it 'should have a legend and label with the label text inside the fieldset' do
31
- output_buffer.should have_tag('form li.date fieldset legend.label label', /Publish at/)
31
+ output_buffer.should have_tag('form li.date_select fieldset legend.label label', /Publish at/)
32
32
  end
33
33
 
34
34
  it 'should associate the legend label with the first select' do
35
- output_buffer.should have_tag('form li.date fieldset legend.label')
36
- output_buffer.should have_tag('form li.date fieldset legend.label label')
37
- output_buffer.should have_tag('form li.date fieldset legend.label label[@for]')
38
- output_buffer.should have_tag('form li.date fieldset legend.label label[@for="post_publish_at_1i"]')
35
+ output_buffer.should have_tag('form li.date_select fieldset legend.label')
36
+ output_buffer.should have_tag('form li.date_select fieldset legend.label label')
37
+ output_buffer.should have_tag('form li.date_select fieldset legend.label label[@for]')
38
+ output_buffer.should have_tag('form li.date_select fieldset legend.label label[@for="post_publish_at_1i"]')
39
39
  end
40
40
 
41
41
  it 'should have an ordered list of three items inside the fieldset' do
42
- output_buffer.should have_tag('form li.date fieldset ol.fragments-group')
43
- output_buffer.should have_tag('form li.date fieldset ol li.fragment', :count => 3)
42
+ output_buffer.should have_tag('form li.date_select fieldset ol.fragments-group')
43
+ output_buffer.should have_tag('form li.date_select fieldset ol li.fragment', :count => 3)
44
44
  end
45
45
 
46
46
  it 'should have three labels for year, month and day' do
47
- output_buffer.should have_tag('form li.date fieldset ol li label', :count => 3)
48
- output_buffer.should have_tag('form li.date fieldset ol li label', /year/i)
49
- output_buffer.should have_tag('form li.date fieldset ol li label', /month/i)
50
- output_buffer.should have_tag('form li.date fieldset ol li label', /day/i)
47
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', :count => 3)
48
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', /year/i)
49
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', /month/i)
50
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', /day/i)
51
51
  end
52
52
 
53
53
  it 'should have three selects for year, month and day' do
54
- output_buffer.should have_tag('form li.date fieldset ol li select', :count => 3)
54
+ output_buffer.should have_tag('form li.date_select fieldset ol li select', :count => 3)
55
55
  end
56
56
  end
57
57
 
@@ -60,7 +60,7 @@ describe 'date input' do
60
60
  before do
61
61
  output_buffer.replace ''
62
62
  concat(semantic_form_for(@new_post, :namespace => "context2") do |builder|
63
- concat(builder.input(:publish_at, :as => :date, :order => [:year, :month, :day]))
63
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:year, :month, :day]))
64
64
  end)
65
65
  end
66
66
 
@@ -79,7 +79,7 @@ describe 'date input' do
79
79
 
80
80
  concat(semantic_form_for(@new_post) do |builder|
81
81
  concat(builder.fields_for(:author, :index => 3) do |author|
82
- concat(author.input(:created_at, :as => :date))
82
+ concat(author.input(:created_at, :as => :date_select))
83
83
  end)
84
84
  end)
85
85
  end
@@ -108,40 +108,40 @@ describe 'date input' do
108
108
  it "should replace the #{field} label with the specified text if :labels[:#{field}] is set" do
109
109
  output_buffer.replace ''
110
110
  concat(semantic_form_for(@new_post) do |builder|
111
- concat(builder.input(:created_at, :as => :date, :labels => { field => "another #{field} label" }))
111
+ concat(builder.input(:created_at, :as => :date_select, :labels => { field => "another #{field} label" }))
112
112
  end)
113
- output_buffer.should have_tag('form li.date fieldset ol li label', :count => fields.length)
113
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', :count => fields.length)
114
114
  fields.each do |f|
115
- output_buffer.should have_tag('form li.date fieldset ol li label', f == field ? /another #{f} label/i : /#{f}/i)
115
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', f == field ? /another #{f} label/i : /#{f}/i)
116
116
  end
117
117
  end
118
118
 
119
119
  it "should not display the label for the #{field} field when :labels[:#{field}] is blank" do
120
120
  output_buffer.replace ''
121
121
  concat(semantic_form_for(@new_post) do |builder|
122
- concat(builder.input(:created_at, :as => :date, :labels => { field => "" }))
122
+ concat(builder.input(:created_at, :as => :date_select, :labels => { field => "" }))
123
123
  end)
124
- output_buffer.should have_tag('form li.date fieldset ol li label', :count => fields.length-1)
124
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', :count => fields.length-1)
125
125
  fields.each do |f|
126
- output_buffer.should have_tag('form li.date fieldset ol li label', /#{f}/i) unless field == f
126
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', /#{f}/i) unless field == f
127
127
  end
128
128
  end
129
129
 
130
130
  it "should not display the label for the #{field} field when :labels[:#{field}] is false" do
131
131
  output_buffer.replace ''
132
132
  concat(semantic_form_for(@new_post) do |builder|
133
- concat(builder.input(:created_at, :as => :date, :labels => { field => false }))
133
+ concat(builder.input(:created_at, :as => :date_select, :labels => { field => false }))
134
134
  end)
135
- output_buffer.should have_tag('form li.date fieldset ol li label', :count => fields.length-1)
135
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', :count => fields.length-1)
136
136
  fields.each do |f|
137
- output_buffer.should have_tag('form li.date fieldset ol li label', /#{f}/i) unless field == f
137
+ output_buffer.should have_tag('form li.date_select fieldset ol li label', /#{f}/i) unless field == f
138
138
  end
139
139
  end
140
140
 
141
141
  it "should not render unsafe HTML when :labels[:#{field}] is false" do
142
142
  output_buffer.replace ''
143
143
  concat(semantic_form_for(@new_post) do |builder|
144
- concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => false }))
144
+ concat(builder.input(:created_at, :as => :date_select, :include_seconds => true, :labels => { field => false }))
145
145
  end)
146
146
  output_buffer.should_not include(">")
147
147
  end
@@ -153,7 +153,7 @@ describe 'date input' do
153
153
  it "should add the required attribute to the input's html options" do
154
154
  with_config :use_required_attribute, true do
155
155
  concat(semantic_form_for(@new_post) do |builder|
156
- concat(builder.input(:title, :as => :date, :required => true))
156
+ concat(builder.input(:title, :as => :date_select, :required => true))
157
157
  end)
158
158
  output_buffer.should have_tag("select[@required]", :count => 3)
159
159
  end
@@ -164,7 +164,7 @@ describe 'date input' do
164
164
  before do
165
165
  output_buffer.replace ''
166
166
  concat(semantic_form_for(@new_post) do |builder|
167
- concat(builder.input(:publish_at, :as => :date, :order => [:year, :month]))
167
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:year, :month]))
168
168
  end)
169
169
  end
170
170
 
@@ -181,7 +181,7 @@ describe 'date input' do
181
181
  before do
182
182
  output_buffer.replace ''
183
183
  concat(semantic_form_for(@new_post) do |builder|
184
- concat(builder.input(:publish_at, :as => :date, :order => [:year, :day]))
184
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:year, :day]))
185
185
  end)
186
186
  end
187
187
 
@@ -198,7 +198,7 @@ describe 'date input' do
198
198
  before do
199
199
  output_buffer.replace ''
200
200
  concat(semantic_form_for(@new_post) do |builder|
201
- concat(builder.input(:publish_at, :as => :date, :order => [:month, :day]))
201
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:month, :day]))
202
202
  end)
203
203
  end
204
204
 
@@ -215,12 +215,12 @@ describe 'date input' do
215
215
  before do
216
216
  output_buffer.replace ''
217
217
  concat(semantic_form_for(@new_post) do |builder|
218
- concat(builder.input(:publish_at, :as => :date, :order => [:day, :month, :year]))
218
+ concat(builder.input(:publish_at, :as => :date_select, :order => [:day, :month, :year]))
219
219
  end)
220
220
  end
221
221
 
222
222
  it 'should associate the legend label with the new first select' do
223
- output_buffer.should have_tag('form li.date fieldset legend.label label[@for="post_publish_at_3i"]')
223
+ output_buffer.should have_tag('form li.date_select fieldset legend.label label[@for="post_publish_at_3i"]')
224
224
  end
225
225
  end
226
226
 
@@ -0,0 +1,490 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe 'datetime_picker input' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+ end
12
+
13
+ after do
14
+ ::I18n.backend.reload!
15
+ end
16
+
17
+ context "with an object" do
18
+ before do
19
+ concat(semantic_form_for(@new_post) do |builder|
20
+ concat(builder.input(:publish_at, :as => :datetime_picker))
21
+ end)
22
+ end
23
+
24
+ it_should_have_input_wrapper_with_class(:datetime_picker)
25
+ it_should_have_input_wrapper_with_class(:input)
26
+ it_should_have_input_wrapper_with_class(:stringish)
27
+ it_should_have_input_wrapper_with_id("post_publish_at_input")
28
+ it_should_have_label_with_text(/Publish at/)
29
+ it_should_have_label_for("post_publish_at")
30
+ it_should_have_input_with_id("post_publish_at")
31
+ it_should_have_input_with_type("datetime-local")
32
+ it_should_have_input_with_name("post[publish_at]")
33
+ it_should_apply_custom_input_attributes_when_input_html_provided(:datetime_picker)
34
+ it_should_apply_custom_for_to_label_when_input_html_id_provided(:datetime_picker)
35
+ # TODO why does this blow-up it_should_apply_error_logic_for_input_type(:datetime_picker)
36
+
37
+ end
38
+
39
+ describe ":local option for UTC or local time" do
40
+
41
+ it "should default to a datetime-local input (true)" do
42
+ concat(
43
+ semantic_form_for(@new_post) do |f|
44
+ concat(f.input(:publish_at, :as => :datetime_picker))
45
+ end
46
+ )
47
+ output_buffer.should have_tag "input[type='datetime-local']"
48
+ end
49
+
50
+ it "can be set to true for a datetime-local" do
51
+ concat(
52
+ semantic_form_for(@new_post) do |f|
53
+ concat(f.input(:publish_at, :as => :datetime_picker, :local => true))
54
+ end
55
+ )
56
+ output_buffer.should have_tag "input[type='datetime-local']"
57
+ end
58
+
59
+ it "can be set to false for a datetime" do
60
+ concat(
61
+ semantic_form_for(@new_post) do |f|
62
+ concat(f.input(:publish_at, :as => :datetime_picker, :local => false))
63
+ end
64
+ )
65
+ output_buffer.should have_tag "input[type='datetime']"
66
+ end
67
+
68
+ end
69
+
70
+ describe "size attribute" do
71
+
72
+ it "defaults to 10 chars (YYYY-YY-YY HH:MM)" do
73
+ concat(
74
+ semantic_form_for(@new_post) do |f|
75
+ concat(f.input(:publish_at, :as => :datetime_picker))
76
+ end
77
+ )
78
+ output_buffer.should have_tag "input[size='16']"
79
+ end
80
+
81
+ it "can be set from :input_html options" do
82
+ concat(
83
+ semantic_form_for(@new_post) do |f|
84
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :size => "11" }))
85
+ end
86
+ )
87
+ output_buffer.should have_tag "input[size='11']"
88
+ end
89
+
90
+ it "can be set from options (ignoring input_html)" do
91
+ concat(
92
+ semantic_form_for(@new_post) do |f|
93
+ concat(f.input(:publish_at, :as => :datetime_picker, :size => '12', :input_html => { :size => "11" }))
94
+ end
95
+ )
96
+ output_buffer.should have_tag "input[size='12']"
97
+ end
98
+
99
+ end
100
+
101
+ describe "maxlength attribute" do
102
+
103
+ it "defaults to 10 chars (YYYY-YY-YY HH:MM)" do
104
+ concat(
105
+ semantic_form_for(@new_post) do |f|
106
+ concat(f.input(:publish_at, :as => :datetime_picker))
107
+ end
108
+ )
109
+ output_buffer.should have_tag "input[maxlength='16']"
110
+ end
111
+
112
+ it "can be set from :input_html options" do
113
+ concat(
114
+ semantic_form_for(@new_post) do |f|
115
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :maxlength => "11" }))
116
+ end
117
+ )
118
+ output_buffer.should have_tag "input[maxlength='11']"
119
+ end
120
+
121
+ it "can be set from options (ignoring input_html)" do
122
+ concat(
123
+ semantic_form_for(@new_post) do |f|
124
+ concat(f.input(:publish_at, :as => :datetime_picker, :maxlength => 12, :input_html => { :maxlength => "11" }))
125
+ end
126
+ )
127
+ output_buffer.should have_tag "input[maxlength='12']"
128
+ end
129
+
130
+ end
131
+
132
+ describe "value attribute" do
133
+
134
+ context "when method returns nil" do
135
+
136
+ it "has no value" do
137
+ concat(
138
+ semantic_form_for(@new_post) do |f|
139
+ concat(f.input(:publish_at, :as => :datetime_picker ))
140
+ end
141
+ )
142
+ output_buffer.should_not have_tag "li input[value]"
143
+ end
144
+
145
+ it "can be set from :input_html options" do
146
+ concat(
147
+ semantic_form_for(@new_post) do |f|
148
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :value => "1111-11-11 23:00" }))
149
+ end
150
+ )
151
+ output_buffer.should have_tag "input[value='1111-11-11 23:00']"
152
+ end
153
+
154
+ end
155
+
156
+ context "when method returns a Date" do
157
+
158
+ before do
159
+ @date = Date.new(2000, 11, 11)
160
+ @new_post.stub!(:publish_at).and_return(@date)
161
+ end
162
+
163
+ it "renders the date as YYYY-MM-DD 00:00" do
164
+ concat(
165
+ semantic_form_for(@new_post) do |f|
166
+ concat(f.input(:publish_at, :as => :datetime_picker ))
167
+ end
168
+ )
169
+ output_buffer.should have_tag "input[value='#{@date.to_s} 00:00']"
170
+ end
171
+
172
+ it "can be set from :input_html options" do
173
+ concat(
174
+ semantic_form_for(@new_post) do |f|
175
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :value => "1111-11-11 00:00" }))
176
+ end
177
+ )
178
+ output_buffer.should have_tag "input[value='1111-11-11 00:00']"
179
+ end
180
+
181
+ end
182
+
183
+ context "when method returns a Time" do
184
+
185
+ before do
186
+ @time = Time.utc(2000,11,11,11,11,11)
187
+ @new_post.stub!(:publish_at).and_return(@time)
188
+ end
189
+
190
+ it "renders the time as a YYYY-MM-DD HH:MM" do
191
+ concat(
192
+ semantic_form_for(@new_post) do |f|
193
+ concat(f.input(:publish_at, :as => :datetime_picker ))
194
+ end
195
+ )
196
+ output_buffer.should have_tag "input[value='2000-11-11 11:11']"
197
+ end
198
+
199
+ it "can be set from :input_html options" do
200
+ concat(
201
+ semantic_form_for(@new_post) do |f|
202
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :value => "1111-11-11 11:11" }))
203
+ end
204
+ )
205
+ output_buffer.should have_tag "input[value='1111-11-11 11:11']"
206
+ end
207
+
208
+ end
209
+
210
+ context "when method returns an empty String" do
211
+
212
+ before do
213
+ @new_post.stub!(:publish_at).and_return("")
214
+ end
215
+
216
+ it "will be empty" do
217
+ concat(
218
+ semantic_form_for(@new_post) do |f|
219
+ concat(f.input(:publish_at, :as => :datetime_picker ))
220
+ end
221
+ )
222
+ output_buffer.should have_tag "input[value='']"
223
+ end
224
+
225
+ it "can be set from :input_html options" do
226
+ concat(
227
+ semantic_form_for(@new_post) do |f|
228
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :value => "1111-11-11 11:11" }))
229
+ end
230
+ )
231
+ output_buffer.should have_tag "input[value='1111-11-11 11:11']"
232
+ end
233
+
234
+ end
235
+
236
+ context "when method returns a String" do
237
+
238
+ before do
239
+ @new_post.stub!(:publish_at).and_return("yeah")
240
+ end
241
+
242
+ it "will be the string" do
243
+ concat(
244
+ semantic_form_for(@new_post) do |f|
245
+ concat(f.input(:publish_at, :as => :datetime_picker ))
246
+ end
247
+ )
248
+ output_buffer.should have_tag "input[value='yeah']"
249
+ end
250
+
251
+ it "can be set from :input_html options" do
252
+ concat(
253
+ semantic_form_for(@new_post) do |f|
254
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :value => "1111-11-11 11:11" }))
255
+ end
256
+ )
257
+ output_buffer.should have_tag "input[value='1111-11-11 11:11']"
258
+ end
259
+
260
+ end
261
+
262
+ end
263
+
264
+ describe "min attribute" do
265
+
266
+ it "will be omitted by default" do
267
+ concat(
268
+ semantic_form_for(@new_post) do |f|
269
+ concat(f.input(:publish_at, :as => :datetime_picker))
270
+ end
271
+ )
272
+ output_buffer.should_not have_tag "input[min]"
273
+ end
274
+
275
+ it "can be set from :input_html options" do
276
+ concat(
277
+ semantic_form_for(@new_post) do |f|
278
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :min => "1970-01-01 12:00" }))
279
+ end
280
+ )
281
+ output_buffer.should have_tag "input[min='1970-01-01 12:00']"
282
+ end
283
+
284
+ end
285
+
286
+ describe "max attribute" do
287
+
288
+ it "will be omitted by default" do
289
+ concat(
290
+ semantic_form_for(@new_post) do |f|
291
+ concat(f.input(:publish_at, :as => :datetime_picker))
292
+ end
293
+ )
294
+ output_buffer.should_not have_tag "input[max]"
295
+ end
296
+
297
+ it "can be set from :input_html options" do
298
+ concat(
299
+ semantic_form_for(@new_post) do |f|
300
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :max => "1970-01-01 12:00" }))
301
+ end
302
+ )
303
+ output_buffer.should have_tag "input[max='1970-01-01 12:00']"
304
+ end
305
+
306
+ end
307
+
308
+ describe "step attribute" do
309
+
310
+ it "defaults to 1" do
311
+ concat(
312
+ semantic_form_for(@new_post) do |f|
313
+ concat(f.input(:publish_at, :as => :datetime_picker))
314
+ end
315
+ )
316
+ output_buffer.should have_tag "input[step='1']"
317
+ end
318
+
319
+ it "can be set from :input_html options" do
320
+ concat(
321
+ semantic_form_for(@new_post) do |f|
322
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :step => "5" }))
323
+ end
324
+ )
325
+ output_buffer.should have_tag "input[step='5']"
326
+ end
327
+
328
+ describe "macros" do
329
+ before do
330
+ concat(
331
+ semantic_form_for(@new_post) do |f|
332
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :step => step }))
333
+ end
334
+ )
335
+ end
336
+
337
+ context ":second" do
338
+ let(:step) { :second }
339
+ it "uses 1" do
340
+ output_buffer.should have_tag "input[step='1']"
341
+ end
342
+ end
343
+
344
+ context ":minute" do
345
+ let(:step) { :minute }
346
+ it "uses 60" do
347
+ output_buffer.should have_tag "input[step='60']"
348
+ end
349
+ end
350
+
351
+ context ":fifteen_minutes" do
352
+ let(:step) { :fifteen_minutes }
353
+ it "uses 900" do
354
+ output_buffer.should have_tag "input[step='900']"
355
+ end
356
+ end
357
+
358
+ context ":quarter_hour" do
359
+ let(:step) { :quarter_hour }
360
+ it "uses 900" do
361
+ output_buffer.should have_tag "input[step='900']"
362
+ end
363
+ end
364
+
365
+ context ":thirty_minutes" do
366
+ let(:step) { :thirty_minutes }
367
+ it "uses 1800" do
368
+ output_buffer.should have_tag "input[step='1800']"
369
+ end
370
+ end
371
+
372
+ context ":half_hour" do
373
+ let(:step) { :half_hour }
374
+ it "uses 1800" do
375
+ output_buffer.should have_tag "input[step='1800']"
376
+ end
377
+ end
378
+
379
+ context ":hour" do
380
+ let(:step) { :hour }
381
+ it "uses 3600" do
382
+ output_buffer.should have_tag "input[step='3600']"
383
+ end
384
+ end
385
+
386
+ context ":sixty_minutes" do
387
+ let(:step) { :sixty_minutes }
388
+ it "uses 3600" do
389
+ output_buffer.should have_tag "input[step='3600']"
390
+ end
391
+ end
392
+
393
+ end
394
+
395
+ end
396
+
397
+ describe "placeholder attribute" do
398
+
399
+ it "will be omitted" do
400
+ concat(
401
+ semantic_form_for(@new_post) do |f|
402
+ concat(f.input(:publish_at, :as => :datetime_picker))
403
+ end
404
+ )
405
+ output_buffer.should_not have_tag "input[placeholder]"
406
+ end
407
+
408
+ it "can be set from :input_html options" do
409
+ concat(
410
+ semantic_form_for(@new_post) do |f|
411
+ concat(f.input(:publish_at, :as => :datetime_picker, :input_html => { :placeholder => "1970-01-01 00:00" }))
412
+ end
413
+ )
414
+ output_buffer.should have_tag "input[placeholder='1970-01-01 00:00']"
415
+ end
416
+
417
+ context "with i18n set" do
418
+ before do
419
+ ::I18n.backend.store_translations :en, :formtastic => { :placeholders => { :publish_at => 'YYYY-MM-DD HH:MM' }}
420
+ end
421
+
422
+ it "can be set with i18n" do
423
+ with_config :i18n_lookups_by_default, true do
424
+ concat(semantic_form_for(@new_post) do |builder|
425
+ concat(builder.input(:publish_at, :as => :datetime_picker))
426
+ end)
427
+ output_buffer.should have_tag('input[@placeholder="YYYY-MM-DD HH:MM"]')
428
+ end
429
+ end
430
+
431
+ it "can be set with input_html, trumping i18n" do
432
+ with_config :i18n_lookups_by_default, true do
433
+ concat(semantic_form_for(@new_post) do |builder|
434
+ concat(builder.input(:publish_at, :as => :datetime_picker, :input_html => { :placeholder => "Something" }))
435
+ end)
436
+ output_buffer.should have_tag('input[@placeholder="Something"]')
437
+ end
438
+ end
439
+ end
440
+
441
+ end
442
+
443
+ describe "when namespace is provided" do
444
+ before do
445
+ concat(semantic_form_for(@new_post, :namespace => "context2") do |builder|
446
+ concat(builder.input(:publish_at, :as => :datetime_picker))
447
+ end)
448
+ end
449
+
450
+ it_should_have_input_wrapper_with_id("context2_post_publish_at_input")
451
+ it_should_have_label_and_input_with_id("context2_post_publish_at")
452
+ end
453
+
454
+ describe "when index is provided" do
455
+ before do
456
+ @output_buffer = ''
457
+ mock_everything
458
+
459
+ concat(semantic_form_for(@new_post) do |builder|
460
+ concat(builder.fields_for(:author, :index => 3) do |author|
461
+ concat(author.input(:created_at, :as => :datetime_picker))
462
+ end)
463
+ end)
464
+ end
465
+
466
+ it 'should index the id of the wrapper' do
467
+ output_buffer.should have_tag("li#post_author_attributes_3_created_at_input")
468
+ end
469
+
470
+ it 'should index the id of the select tag' do
471
+ output_buffer.should have_tag("input#post_author_attributes_3_created_at")
472
+ end
473
+
474
+ it 'should index the name of the select tag' do
475
+ output_buffer.should have_tag("input[@name='post[author_attributes][3][created_at]']")
476
+ end
477
+ end
478
+
479
+ describe "when required" do
480
+ it "should add the required attribute to the input's html options" do
481
+ with_config :use_required_attribute, true do
482
+ concat(semantic_form_for(@new_post) do |builder|
483
+ concat(builder.input(:publish_at, :as => :datetime_picker, :required => true))
484
+ end)
485
+ output_buffer.should have_tag("input[@required]")
486
+ end
487
+ end
488
+ end
489
+
490
+ end