formtastic 2.1.1 → 2.2.0.rc

Sign up to get free protection for your applications and to get access to all the features.
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 'time input' do
4
+ describe 'time select input' do
5
5
 
6
6
  include FormtasticSpecHelper
7
7
 
@@ -19,7 +19,7 @@ describe 'time input' do
19
19
  describe "with :ignore_date => true" do
20
20
  before do
21
21
  concat(semantic_form_for(@new_post) do |builder|
22
- concat(builder.input(:publish_at, :as => :time, :ignore_date => true))
22
+ concat(builder.input(:publish_at, :as => :time_select, :ignore_date => true))
23
23
  end)
24
24
  end
25
25
 
@@ -40,7 +40,7 @@ describe 'time input' do
40
40
  before do
41
41
  @new_post.stub(:publish_at).and_return(Time.parse('2010-11-07'))
42
42
  concat(semantic_form_for(@new_post) do |builder|
43
- concat(builder.input(:publish_at, :as => :time, :ignore_date => false))
43
+ concat(builder.input(:publish_at, :as => :time_select, :ignore_date => false))
44
44
  end)
45
45
  end
46
46
 
@@ -59,7 +59,7 @@ describe 'time input' do
59
59
  end
60
60
 
61
61
  it 'should associate the legend label with the hour select' do
62
- output_buffer.should have_tag('form li.time fieldset legend.label label[@for="post_publish_at_4i"]')
62
+ output_buffer.should have_tag('form li.time_select fieldset legend.label label[@for="post_publish_at_4i"]')
63
63
  end
64
64
 
65
65
  end
@@ -68,7 +68,7 @@ describe 'time input' do
68
68
  before do
69
69
  @new_post.stub(:publish_at)
70
70
  concat(semantic_form_for(@new_post) do |builder|
71
- concat(builder.input(:publish_at, :as => :time, :ignore_date => false))
71
+ concat(builder.input(:publish_at, :as => :time_select, :ignore_date => false))
72
72
  end)
73
73
  end
74
74
 
@@ -94,58 +94,58 @@ describe 'time input' do
94
94
  describe "without seconds" do
95
95
  before do
96
96
  concat(semantic_form_for(@new_post) do |builder|
97
- concat(builder.input(:publish_at, :as => :time))
97
+ concat(builder.input(:publish_at, :as => :time_select))
98
98
  end)
99
99
  end
100
100
 
101
- it_should_have_input_wrapper_with_class("time")
101
+ it_should_have_input_wrapper_with_class("time_select")
102
102
  it_should_have_input_wrapper_with_class(:input)
103
103
  it_should_have_input_wrapper_with_id("post_publish_at_input")
104
104
  it_should_have_a_nested_fieldset
105
105
  it_should_have_a_nested_fieldset_with_class('fragments')
106
106
  it_should_have_a_nested_ordered_list_with_class('fragments-group')
107
- it_should_apply_error_logic_for_input_type(:time)
107
+ it_should_apply_error_logic_for_input_type(:time_select)
108
108
 
109
109
  it 'should have a legend and label with the label text inside the fieldset' do
110
- output_buffer.should have_tag('form li.time fieldset legend.label label', /Publish at/)
110
+ output_buffer.should have_tag('form li.time_select fieldset legend.label label', /Publish at/)
111
111
  end
112
112
 
113
113
  it 'should associate the legend label with the first select' do
114
- output_buffer.should have_tag('form li.time fieldset legend.label label[@for="post_publish_at_4i"]')
114
+ output_buffer.should have_tag('form li.time_select fieldset legend.label label[@for="post_publish_at_4i"]')
115
115
  end
116
116
 
117
117
  it 'should have an ordered list of two items inside the fieldset' do
118
- output_buffer.should have_tag('form li.time fieldset ol.fragments-group')
119
- output_buffer.should have_tag('form li.time fieldset ol li.fragment', :count => 2)
118
+ output_buffer.should have_tag('form li.time_select fieldset ol.fragments-group')
119
+ output_buffer.should have_tag('form li.time_select fieldset ol li.fragment', :count => 2)
120
120
  end
121
121
 
122
122
  it 'should have five labels for hour and minute' do
123
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => 2)
124
- output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
125
- output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
123
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', :count => 2)
124
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /hour/i)
125
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /minute/i)
126
126
  end
127
127
 
128
128
  it 'should have two selects for hour and minute' do
129
- output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
129
+ output_buffer.should have_tag('form li.time_select fieldset ol li', :count => 2)
130
130
  end
131
131
  end
132
132
 
133
133
  describe "with seconds" do
134
134
  before do
135
135
  concat(semantic_form_for(@new_post) do |builder|
136
- concat(builder.input(:publish_at, :as => :time, :include_seconds => true))
136
+ concat(builder.input(:publish_at, :as => :time_select, :include_seconds => true))
137
137
  end)
138
138
  end
139
139
 
140
140
  it 'should have five labels for hour and minute' do
141
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => 3)
142
- output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
143
- output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
144
- output_buffer.should have_tag('form li.time fieldset ol li label', /second/i)
141
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', :count => 3)
142
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /hour/i)
143
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /minute/i)
144
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /second/i)
145
145
  end
146
146
 
147
147
  it 'should have three selects for hour, minute and seconds' do
148
- output_buffer.should have_tag('form li.time fieldset ol li', :count => 3)
148
+ output_buffer.should have_tag('form li.time_select fieldset ol li', :count => 3)
149
149
  end
150
150
 
151
151
  it 'should generate a sanitized label and matching ids for attribute' do
@@ -163,40 +163,40 @@ describe 'time input' do
163
163
  it "should replace the #{field} label with the specified text if :labels[:#{field}] is set" do
164
164
  output_buffer.replace ''
165
165
  concat(semantic_form_for(@new_post) do |builder|
166
- concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => "another #{field} label" }))
166
+ concat(builder.input(:created_at, :as => :time_select, :include_seconds => true, :labels => { field => "another #{field} label" }))
167
167
  end)
168
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => fields.length)
168
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', :count => fields.length)
169
169
  fields.each do |f|
170
- output_buffer.should have_tag('form li.time fieldset ol li label', f == field ? /another #{f} label/i : /#{f}/i)
170
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', f == field ? /another #{f} label/i : /#{f}/i)
171
171
  end
172
172
  end
173
173
 
174
174
  it "should not display the label for the #{field} field when :labels[:#{field}] is blank" do
175
175
  output_buffer.replace ''
176
176
  concat(semantic_form_for(@new_post) do |builder|
177
- concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => "" }))
177
+ concat(builder.input(:created_at, :as => :time_select, :include_seconds => true, :labels => { field => "" }))
178
178
  end)
179
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => fields.length-1)
179
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', :count => fields.length-1)
180
180
  fields.each do |f|
181
- output_buffer.should have_tag('form li.time fieldset ol li label', /#{f}/i) unless field == f
181
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /#{f}/i) unless field == f
182
182
  end
183
183
  end
184
184
 
185
185
  it "should not render the label when :labels[:#{field}] is false" do
186
186
  output_buffer.replace ''
187
187
  concat(semantic_form_for(@new_post) do |builder|
188
- concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => false }))
188
+ concat(builder.input(:created_at, :as => :time_select, :include_seconds => true, :labels => { field => false }))
189
189
  end)
190
- output_buffer.should have_tag('form li.time fieldset ol li label', :count => fields.length-1)
190
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', :count => fields.length-1)
191
191
  fields.each do |f|
192
- output_buffer.should have_tag('form li.time fieldset ol li label', /#{f}/i) unless field == f
192
+ output_buffer.should have_tag('form li.time_select fieldset ol li label', /#{f}/i) unless field == f
193
193
  end
194
194
  end
195
195
 
196
196
  it "should not render unsafe HTML when :labels[:#{field}] is false" do
197
197
  output_buffer.replace ''
198
198
  concat(semantic_form_for(@new_post) do |builder|
199
- concat(builder.input(:created_at, :as => :time, :include_seconds => true, :labels => { field => false }))
199
+ concat(builder.input(:created_at, :as => :time_select, :include_seconds => true, :labels => { field => false }))
200
200
  end)
201
201
  output_buffer.should_not include(">")
202
202
  end
@@ -207,7 +207,7 @@ describe 'time input' do
207
207
  describe ':namespace option' do
208
208
  before do
209
209
  concat(semantic_form_for(@new_post, :namespace => 'form2') do |builder|
210
- concat(builder.input(:publish_at, :as => :time))
210
+ concat(builder.input(:publish_at, :as => :time_select))
211
211
  end)
212
212
  end
213
213
 
@@ -222,7 +222,7 @@ describe 'time input' do
222
222
  it "should add the required attribute to the input's html options" do
223
223
  with_config :use_required_attribute, true do
224
224
  concat(semantic_form_for(@new_post) do |builder|
225
- concat(builder.input(:title, :as => :time, :required => true))
225
+ concat(builder.input(:title, :as => :time_select, :required => true))
226
226
  end)
227
227
  output_buffer.should have_tag("select[@required]", :count => 2)
228
228
  end
@@ -234,7 +234,7 @@ describe 'time input' do
234
234
  before do
235
235
  concat(semantic_form_for(@new_post) do |builder|
236
236
  concat(builder.fields_for(:author, :index => 3) do |author|
237
- concat(author.input(:created_at, :as => :time))
237
+ concat(author.input(:created_at, :as => :time_select))
238
238
  end)
239
239
  end)
240
240
  end
data/spec/spec_helper.rb CHANGED
@@ -413,7 +413,31 @@ module FormtasticSpecHelper
413
413
  yield
414
414
  Formtastic::FormBuilder.send(:"#{config_method_name}=", old_value)
415
415
  end
416
-
416
+
417
+ class ToSMatcher
418
+ def initialize(str)
419
+ @str=str.to_s
420
+ end
421
+
422
+ def matches?(value)
423
+ value.to_s==@str
424
+ end
425
+
426
+ def failure_message_for_should
427
+ "Expected argument that converted to #{@str}"
428
+ end
429
+ end
430
+
431
+ def errors_matcher(method)
432
+ # In edge rails (Rails 4) tags store method_name as a string and index the errors object using a string
433
+ # therefore allow stubs to match on either string or symbol. The errors object calls to_sym on all index
434
+ # accesses so @object.errors[:abc] is equivalent to @object.errors["abc"]
435
+ if Rails::VERSION::MAJOR == 4
436
+ ToSMatcher.new(method)
437
+ else
438
+ method
439
+ end
440
+ end
417
441
  end
418
442
 
419
443
  ::ActiveSupport::Deprecation.silenced = false
@@ -177,9 +177,9 @@ module CustomMacros
177
177
  before do
178
178
  @title_errors = ['must not be blank', 'must be longer than 10 characters', 'must be awesome']
179
179
  @errors = mock('errors')
180
- @errors.stub!(:[]).with(:title).and_return(@title_errors)
180
+ @errors.stub!(:[]).with(errors_matcher(:title)).and_return(@title_errors)
181
181
  Formtastic::FormBuilder.file_metadata_suffixes.each do |suffix|
182
- @errors.stub!(:[]).with("title_#{suffix}".to_sym).and_return(nil)
182
+ @errors.stub!(:[]).with(errors_matcher("title_#{suffix}".to_sym)).and_return(nil)
183
183
  end
184
184
  @new_post.stub!(:errors).and_return(@errors)
185
185
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formtastic
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
5
- prerelease:
4
+ hash: -1676882131
5
+ prerelease: 6
6
6
  segments:
7
7
  - 2
8
- - 1
9
- - 1
10
- version: 2.1.1
8
+ - 2
9
+ - 0
10
+ - rc
11
+ version: 2.2.0.rc
11
12
  platform: ruby
12
13
  authors:
13
14
  - Justin French
@@ -15,8 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2012-03-03 00:00:00 +11:00
19
- default_executable:
19
+ date: 2012-03-27 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: actionpack
@@ -24,7 +24,7 @@ dependencies:
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  hash: 7
30
30
  segments:
@@ -226,6 +226,7 @@ files:
226
226
  - gemfiles/rails-3.0.gemfile
227
227
  - gemfiles/rails-3.1.gemfile
228
228
  - gemfiles/rails-3.2.gemfile
229
+ - gemfiles/rails-4.gemfile
229
230
  - lib/formtastic.rb
230
231
  - lib/formtastic/actions.rb
231
232
  - lib/formtastic/actions/base.rb
@@ -238,7 +239,6 @@ files:
238
239
  - lib/formtastic/helpers.rb
239
240
  - lib/formtastic/helpers/action_helper.rb
240
241
  - lib/formtastic/helpers/actions_helper.rb
241
- - lib/formtastic/helpers/buttons_helper.rb
242
242
  - lib/formtastic/helpers/errors_helper.rb
243
243
  - lib/formtastic/helpers/fieldset_wrapper.rb
244
244
  - lib/formtastic/helpers/file_column_detection.rb
@@ -254,6 +254,7 @@ files:
254
254
  - lib/formtastic/inputs/base/choices.rb
255
255
  - lib/formtastic/inputs/base/collections.rb
256
256
  - lib/formtastic/inputs/base/database.rb
257
+ - lib/formtastic/inputs/base/datetime_pickerish.rb
257
258
  - lib/formtastic/inputs/base/errors.rb
258
259
  - lib/formtastic/inputs/base/fileish.rb
259
260
  - lib/formtastic/inputs/base/grouped_collections.rb
@@ -272,7 +273,11 @@ files:
272
273
  - lib/formtastic/inputs/check_boxes_input.rb
273
274
  - lib/formtastic/inputs/country_input.rb
274
275
  - lib/formtastic/inputs/date_input.rb
276
+ - lib/formtastic/inputs/date_picker_input.rb
277
+ - lib/formtastic/inputs/date_select_input.rb
275
278
  - lib/formtastic/inputs/datetime_input.rb
279
+ - lib/formtastic/inputs/datetime_picker_input.rb
280
+ - lib/formtastic/inputs/datetime_select_input.rb
276
281
  - lib/formtastic/inputs/email_input.rb
277
282
  - lib/formtastic/inputs/file_input.rb
278
283
  - lib/formtastic/inputs/hidden_input.rb
@@ -286,6 +291,8 @@ files:
286
291
  - lib/formtastic/inputs/string_input.rb
287
292
  - lib/formtastic/inputs/text_input.rb
288
293
  - lib/formtastic/inputs/time_input.rb
294
+ - lib/formtastic/inputs/time_picker_input.rb
295
+ - lib/formtastic/inputs/time_select_input.rb
289
296
  - lib/formtastic/inputs/time_zone_input.rb
290
297
  - lib/formtastic/inputs/url_input.rb
291
298
  - lib/formtastic/localized_string.rb
@@ -314,8 +321,6 @@ files:
314
321
  - spec/generators/formtastic/install/install_generator_spec.rb
315
322
  - spec/helpers/action_helper_spec.rb
316
323
  - spec/helpers/actions_helper_spec.rb
317
- - spec/helpers/buttons_helper_spec.rb
318
- - spec/helpers/commit_button_helper_spec.rb
319
324
  - spec/helpers/form_helper_spec.rb
320
325
  - spec/helpers/input_helper_spec.rb
321
326
  - spec/helpers/inputs_helper_spec.rb
@@ -326,8 +331,11 @@ files:
326
331
  - spec/inputs/check_boxes_input_spec.rb
327
332
  - spec/inputs/country_input_spec.rb
328
333
  - spec/inputs/custom_input_spec.rb
329
- - spec/inputs/date_input_spec.rb
330
- - spec/inputs/datetime_input_spec.rb
334
+ - spec/inputs/date_picker_input_spec.rb
335
+ - spec/inputs/date_select_input_spec.rb
336
+ - spec/inputs/datetime_picker_input_spec.rb
337
+ - spec/inputs/datetime_select_input_spec.rb
338
+ - spec/inputs/deprecated_time_date_datetime_inputs_spec.rb
331
339
  - spec/inputs/email_input_spec.rb
332
340
  - spec/inputs/file_input_spec.rb
333
341
  - spec/inputs/hidden_input_spec.rb
@@ -343,7 +351,8 @@ files:
343
351
  - spec/inputs/select_input_spec.rb
344
352
  - spec/inputs/string_input_spec.rb
345
353
  - spec/inputs/text_input_spec.rb
346
- - spec/inputs/time_input_spec.rb
354
+ - spec/inputs/time_picker_input_spec.rb
355
+ - spec/inputs/time_select_input_spec.rb
347
356
  - spec/inputs/time_zone_input_spec.rb
348
357
  - spec/inputs/url_input_spec.rb
349
358
  - spec/inputs/with_options_spec.rb
@@ -354,7 +363,6 @@ files:
354
363
  - spec/support/deferred_garbage_collection.rb
355
364
  - spec/support/deprecation.rb
356
365
  - spec/support/test_environment.rb
357
- has_rdoc: true
358
366
  homepage: http://github.com/justinfrench/formtastic
359
367
  licenses: []
360
368
 
@@ -384,7 +392,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
384
392
  requirements: []
385
393
 
386
394
  rubyforge_project:
387
- rubygems_version: 1.4.2
395
+ rubygems_version: 1.8.18
388
396
  signing_key:
389
397
  specification_version: 3
390
398
  summary: A Rails form builder plugin/gem with semantically rich and accessible markup
@@ -400,8 +408,6 @@ test_files:
400
408
  - spec/generators/formtastic/install/install_generator_spec.rb
401
409
  - spec/helpers/action_helper_spec.rb
402
410
  - spec/helpers/actions_helper_spec.rb
403
- - spec/helpers/buttons_helper_spec.rb
404
- - spec/helpers/commit_button_helper_spec.rb
405
411
  - spec/helpers/form_helper_spec.rb
406
412
  - spec/helpers/input_helper_spec.rb
407
413
  - spec/helpers/inputs_helper_spec.rb
@@ -412,8 +418,11 @@ test_files:
412
418
  - spec/inputs/check_boxes_input_spec.rb
413
419
  - spec/inputs/country_input_spec.rb
414
420
  - spec/inputs/custom_input_spec.rb
415
- - spec/inputs/date_input_spec.rb
416
- - spec/inputs/datetime_input_spec.rb
421
+ - spec/inputs/date_picker_input_spec.rb
422
+ - spec/inputs/date_select_input_spec.rb
423
+ - spec/inputs/datetime_picker_input_spec.rb
424
+ - spec/inputs/datetime_select_input_spec.rb
425
+ - spec/inputs/deprecated_time_date_datetime_inputs_spec.rb
417
426
  - spec/inputs/email_input_spec.rb
418
427
  - spec/inputs/file_input_spec.rb
419
428
  - spec/inputs/hidden_input_spec.rb
@@ -429,7 +438,8 @@ test_files:
429
438
  - spec/inputs/select_input_spec.rb
430
439
  - spec/inputs/string_input_spec.rb
431
440
  - spec/inputs/text_input_spec.rb
432
- - spec/inputs/time_input_spec.rb
441
+ - spec/inputs/time_picker_input_spec.rb
442
+ - spec/inputs/time_select_input_spec.rb
433
443
  - spec/inputs/time_zone_input_spec.rb
434
444
  - spec/inputs/url_input_spec.rb
435
445
  - spec/inputs/with_options_spec.rb
@@ -440,3 +450,4 @@ test_files:
440
450
  - spec/support/deferred_garbage_collection.rb
441
451
  - spec/support/deprecation.rb
442
452
  - spec/support/test_environment.rb
453
+ has_rdoc:
@@ -1,310 +0,0 @@
1
- module Formtastic
2
- module Helpers
3
-
4
- # ButtonsHelper encapsulates the responsibilties of the {#buttons} and {#commit_button} helpers
5
- # for submitting forms.
6
- #
7
- # {#buttons} is used to wrap the form's button(s) and actions in a `<fieldset>` and `<ol>`,
8
- # with each item in the list containing the markup representing a single button.
9
- #
10
- # {#buttons} is usually called with a block containing a single {#commit_button} call:
11
- #
12
- # <%= semantic_form_for @post do |f| %>
13
- # ...
14
- # <%= f.buttons do %>
15
- # <%= f.commit_button
16
- # <% end %>
17
- # <% end %>
18
- #
19
- # The HTML output will be something like:
20
- #
21
- # <form class="formtastic" method="post" action="...">
22
- # ...
23
- # <fieldset class="buttons">
24
- # <ol>
25
- # <li class="commit button">
26
- # <input type="submit" name="commit" value="Create Post" class="create">
27
- # </li>
28
- # </ol>
29
- # </fieldset>
30
- # </form>
31
- #
32
- # While this may seem slightly over-engineered, it is consistent with the way form inputs are
33
- # handled, and makes room for other types of buttons and actions in future versions (such as
34
- # cancel buttons or links, reset buttons and even alternate actions like 'save and continue
35
- # editing').
36
- #
37
- # It's important to note that the `semantic_form_for` and {#buttons} blocks wrap the
38
- # standard Rails `form_for` helper and form builder, so you have full access to every standard
39
- # Rails form helper, with any HTML markup and ERB syntax, allowing you to "break free" from
40
- # Formtastic when it doesn't suit to create your own buttons, links and actions:
41
- #
42
- # <%= semantic_form_for @post do |f| %>
43
- # ...
44
- # <%= f.buttons do %>
45
- # <li class="save">
46
- # <%= f.submit "Save" %>
47
- # <li>
48
- # <li class="cancel-link">
49
- # Or <%= link_to "Cancel", posts_url %>
50
- # <li>
51
- # <% end %>
52
- # <% end %>
53
- #
54
- # There are many other syntax variations and arguments to customize your form. See the
55
- # full documentation of {#buttons} and {#commit_button} for details.
56
- #
57
- # @deprecated ButtonsHelper will be removed after 2.1
58
- module ButtonsHelper
59
- include Formtastic::Helpers::FieldsetWrapper
60
- include Formtastic::LocalizedString
61
-
62
- # Creates a fieldset and ol tag wrapping for use around a set of buttons. It can be
63
- # called either with a block (in which you can do the usual Rails form stuff, HTML, ERB, etc),
64
- # or with a list of named buttons. These two examples are functionally equivalent:
65
- #
66
- # # With a block:
67
- # <% semantic_form_for @post do |f| %>
68
- # ...
69
- # <% f.buttons do %>
70
- # <%= f.commit_button %>
71
- # <% end %>
72
- # <% end %>
73
- #
74
- # # With a list of fields:
75
- # <% semantic_form_for @post do |f| %>
76
- # <%= f.buttons :commit %>
77
- # <% end %>
78
- #
79
- # # Output:
80
- # <form ...>
81
- # <fieldset class="buttons">
82
- # <ol>
83
- # <li class="commit button">
84
- # <input type="submit" ...>
85
- # </li>
86
- # </ol>
87
- # </fieldset>
88
- # </form>
89
- #
90
- # Only one type of named button is supported at this time (:commit), and it's assumed to be
91
- # the default choice, so this is also functionally equivalent, but may change in the future:
92
- #
93
- # # With no args:
94
- # <% semantic_form_for @post do |f| %>
95
- # ...
96
- # <%= f.buttons %>
97
- # <% end %>
98
- #
99
- # While this may seem slightly over-engineered, it is consistent with the way form inputs are
100
- # handled, and makes room for other types of buttons and actions in future versions (such as
101
- # cancel buttons or links, reset buttons and even alternate actions like 'save and continue
102
- # editing').
103
- #
104
- # All options except `:name` and `:title` are passed down to the fieldset as HTML
105
- # attributes (`id`, `class`, `style`...). If provided, the `:name` or `:title` option is
106
- # passed into a `<legend>` inside the `<fieldset>` to name the set of buttons.
107
- #
108
- # @example Quickly add button(s) to the form, accepting all default values, options and behaviors
109
- # <% semantic_form_for @post do |f| %>
110
- # ...
111
- # <%= f.buttons %>
112
- # <% end %>
113
- #
114
- # @example Specify which named buttons you want, accepting all default values, options and behaviors
115
- # <% semantic_form_for @post do |f| %>
116
- # ...
117
- # <%= f.buttons :commit %>
118
- # <% end %>
119
- #
120
- # @example Specify which named buttons you want, and name the fieldset
121
- # <% semantic_form_for @post do |f| %>
122
- # ...
123
- # <%= f.buttons :commit, :name => "Actions" %>
124
- # or
125
- # <%= f.buttons :commit, :label => "Actions" %>
126
- # <% end %>
127
- #
128
- # @example Get full control over the commit_button options
129
- # <% semantic_form_for @post do |f| %>
130
- # ...
131
- # <%= f.buttons do %>
132
- # <%= f.commit_button :label => "Go", :button_html => { :class => "pretty" :disable_with => "Wait..." }, :wrapper_html => { ... }
133
- # <% end %>
134
- # <% end %>
135
- #
136
- # @example Make your own custom buttons, links or actions with standard Rails helpers or HTML
137
- # <% semantic_form_for @post do |f| %>
138
- # ...
139
- # <%= f.buttons do %>
140
- # <li class="submit">
141
- # <%= f.submit "Submit" %>
142
- # </li>
143
- # <li class="reset">
144
- # <input type="reset" value="Reset">
145
- # </li>
146
- # <li class="cancel">
147
- # <%= link_to "Cancel", posts_url %>
148
- # </li>
149
- # <% end %>
150
- # <% end %>
151
- #
152
- # @example Add HTML attributes to the fieldset
153
- # <% semantic_form_for @post do |f| %>
154
- # ...
155
- # <%= f.buttons :commit, :style => "border:1px;" %>
156
- # or
157
- # <%= f.buttons :style => "border:1px;" do %>
158
- # ...
159
- # <% end %>
160
- # <% end %>
161
- #
162
- # @option *args :label [String, Symbol]
163
- # Optionally specify text for the legend of the fieldset
164
- #
165
- # @option *args :name [String, Symbol]
166
- # Optionally specify text for the legend of the fieldset (alias for `:label`)
167
- #
168
- # @todo document i18n keys
169
- # @deprecated f.buttons is deprecated in favor of f.actions and will be removed after 2.1
170
- def buttons(*args, &block)
171
- ::ActiveSupport::Deprecation.warn("f.buttons is deprecated in favour of f.actions and will be removed from Formtastic after 2.1. Please see ActionsHelper and InputAction or ButtonAction for more information")
172
-
173
- html_options = args.extract_options!
174
- html_options[:class] ||= "buttons"
175
-
176
- if block_given?
177
- field_set_and_list_wrapping(html_options, &block)
178
- else
179
- args = [:commit] if args.empty?
180
- contents = args.map { |button_name| send(:"#{button_name}_button") }
181
- field_set_and_list_wrapping(html_options, contents)
182
- end
183
- end
184
-
185
- # Creates a submit input tag with the value "Save [model name]" (for existing records) or
186
- # "Create [model name]" (for new records) by default. The output is an `<input>` tag with the
187
- # `type` of `submit` and a class of either `create` or `update` (if Formtastic can determin if)
188
- # the record is new or not) with `submit` as a fallback class. The submit button is wrapped in
189
- # an `<li>` tag with a class of `commit`, and is intended to be rendered inside a {#buttons}
190
- # block which wraps the button in a `fieldset` and `ol`.
191
- #
192
- # The textual value of the label can be changed from this default through the `:label`
193
- # argument or through i18n.
194
- #
195
- # You can pass HTML attributes down to the `<input>` tag with the `:button_html` option, and
196
- # pass HTML attributes to the wrapping `<li>` tag with the `:wrapper_html` option.
197
- #
198
- # @example Basic usage
199
- # # form
200
- # <%= semantic_form_for @post do |f| %>
201
- # ...
202
- # <%= f.buttons do %>
203
- # <%= f.commit_button %>
204
- # <% end %>
205
- # <% end %>
206
- #
207
- # # output
208
- # <form ...>
209
- # ...
210
- # <fieldset class="buttons">
211
- # <ol>
212
- # <li class="commit button">
213
- # <input name="commit" type="submit" value="Create Post" class="create">
214
- # </li>
215
- # </ol>
216
- # </fieldset>
217
- # </form>
218
- #
219
- # @example Set the value through the `:label` option
220
- # <%= f.commit_button :label => "Go" %>
221
- #
222
- # @example Set the value through the optional first argument (like Rails' `f.submit`)
223
- # <%= f.commit_button "Go" %>
224
- #
225
- # @example Pass HTML attributes down to the `<input>`
226
- # <%= f.commit_button :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %>
227
- # <%= f.commit_button :label => "Go", :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %>
228
- # <%= f.commit_button "Go", :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %>
229
- #
230
- # @example Pass HTML attributes down to the `<li>` wrapper
231
- # <%= f.commit_button :wrapper_html => { :class => 'special', :id => 'whatever' } %>
232
- # <%= f.commit_button :label => "Go", :wrapper_html => { :class => 'special', :id => 'whatever' } %>
233
- # <%= f.commit_button "Go", :wrapper_html => { :class => 'special', :id => 'whatever' } %>
234
- #
235
- # @option *args :label [String, Symbol]
236
- # Override the label text with a String or a symbold for an i18n translation key
237
- #
238
- # @option *args :button_html [Hash]
239
- # Override or add to the HTML attributes to be passed down to the `<input>` tag
240
- #
241
- # @option *args :wrapper_html [Hash]
242
- # Override or add to the HTML attributes to be passed down to the wrapping `<li>` tag
243
- #
244
- # @todo document i18n keys
245
- # @todo strange that `:accesskey` seems to be supported in the top level args as well as `:button_html`
246
- # @deprecated f.commit_button is deprecated in favor of f.actions and will be removed after 2.1
247
- def commit_button(*args)
248
- ::ActiveSupport::Deprecation.warn("f.commit_button is deprecated in favour of f.action(:submit) and will be removed from Formtastic after 2.1. Please see ActionsHelper and InputAction or ButtonAction for more information")
249
-
250
- options = args.extract_options!
251
- text = options.delete(:label) || args.shift
252
-
253
- text = (localized_string(commit_button_i18n_key, text, :action, :model => commit_button_object_name) ||
254
- Formtastic::I18n.t(commit_button_i18n_key, :model => commit_button_object_name)) unless text.is_a?(::String)
255
-
256
- button_html = options.delete(:button_html) || {}
257
- button_html[:id] ||= "#{@object_name}_submit"
258
- button_html.merge!(:class => [button_html[:class], commit_button_i18n_key].compact.join(' '))
259
-
260
- wrapper_html = options.delete(:wrapper_html) || {}
261
- wrapper_html[:class] = (commit_button_wrapper_html_class << wrapper_html[:class]).flatten.compact.join(' ')
262
-
263
- accesskey = (options.delete(:accesskey) || default_commit_button_accesskey) unless button_html.has_key?(:accesskey)
264
- button_html = button_html.merge(:accesskey => accesskey) if accesskey
265
-
266
- template.content_tag(:li, Formtastic::Util.html_safe(submit(text, button_html)), wrapper_html)
267
- end
268
-
269
- def commit_button_object_name
270
- if new_or_persisted_object?
271
- # Deal with some complications with ActiveRecord::Base.human_name and two name models (eg UserPost)
272
- # ActiveRecord::Base.human_name falls back to ActiveRecord::Base.name.humanize ("Userpost")
273
- # if there's no i18n, which is pretty crappy. In this circumstance we want to detect this
274
- # fall back (human_name == name.humanize) and do our own thing name.underscore.humanize ("User Post")
275
- if @object.class.model_name.respond_to?(:human)
276
- object_name = @object.class.model_name.human
277
- else
278
- object_human_name = @object.class.human_name # default is UserPost => "Userpost", but i18n may do better ("User post")
279
- crappy_human_name = @object.class.name.humanize # UserPost => "Userpost"
280
- decent_human_name = @object.class.name.underscore.humanize # UserPost => "User post"
281
- object_name = (object_human_name == crappy_human_name) ? decent_human_name : object_human_name
282
- end
283
- else
284
- object_name = @object_name.to_s.send(label_str_method)
285
- end
286
-
287
- object_name
288
- end
289
-
290
- def commit_button_i18n_key
291
- if new_or_persisted_object?
292
- key = @object.persisted? ? :update : :create
293
- else
294
- key = :submit
295
- end
296
-
297
- key
298
- end
299
-
300
- def commit_button_wrapper_html_class
301
- ['commit', 'button'] # TODO: Add class reflecting on form action.
302
- end
303
-
304
- def new_or_persisted_object?
305
- @object && (@object.respond_to?(:persisted?) || @object.respond_to?(:new_record?))
306
- end
307
-
308
- end
309
- end
310
- end