1
0
Fork 0
mirror of https://github.com/heartcombo/simple_form.git synced 2022-11-09 12:19:26 -05:00

Support to date, datetime and time inputs.

I changed `DateTimeInput` to support the new HTML5 form helpers that
comes with Rails 4 (`date_input`, `datetime_input` and `time_input`)
instead of rendering datetime selects:

For example, this input:
```erb
<%= f.input :born_on, as: :date %>
```
Will render:
```html
<input id="user_born_on" name="user[born_on]" type="date" />
```

Datetime selects are still present, but only when HTML5 compatibility
is disabled. It's also possible to render selects even with HTML5 on,
by setting the `html5` option to false.

If we wanted to use an old date select on the example above, we should do:
```erb
<%= f.input :born_on, as: :date, html5: false %>
```

Closes #844.
This commit is contained in:
Volmer Soares 2013-11-13 14:44:42 -02:00
parent 1d85b03463
commit fb1f52dbc5
2 changed files with 124 additions and 29 deletions

View file

@ -1,8 +1,14 @@
module SimpleForm
module Inputs
class DateTimeInput < Base
enable :html5
def input
@builder.send(:"#{input_type}_select", attribute_name, input_options, input_html_options)
if use_html5_inputs?
@builder.send(:"#{input_type}_field", attribute_name, input_html_options)
else
@builder.send(:"#{input_type}_select", attribute_name, input_options, input_html_options)
end
end
private
@ -19,6 +25,14 @@ module SimpleForm
position = ActionView::Helpers::DateTimeSelector::POSITION[position]
"#{attribute_name}_#{position}i"
end
def use_html5_inputs?
if input_options.key?(:html5)
input_options[:html5]
else
html5?
end
end
end
end
end

View file

@ -1,18 +1,69 @@
# encoding: UTF-8
require 'test_helper'
# Tests for all different kinds of inputs.
class DateTimeInputTest < ActionView::TestCase
# DateTime input
test 'input should generate a datetime select by default for datetime attributes' do
# Tests for datetime, date and time inputs when HTML5 compatibility is enabled in the wrapper.
class DateTimeInputWithHtml5Test < ActionView::TestCase
test 'input should generate a datetime input for datetime attributes' do
with_input_for @user, :created_at, :datetime
1.upto(5) do |i|
assert_select "form select.datetime#user_created_at_#{i}i"
assert_select 'input[type="datetime"]'
end
test 'input should generate a datetime select for datetime attributes if HTML5 compatibility is explicitly disabled' do
with_input_for @user, :created_at, :datetime, html5: false
assert_select 'select.datetime'
end
test 'input should generate a date input for date attributes' do
with_input_for @user, :born_at, :date
assert_select 'input[type="date"]'
end
test 'input should generate a date select for date attributes if HTML5 compatibility is explicitly disabled' do
with_input_for @user, :born_at, :date, html5: false
assert_select 'select.date'
end
test 'input should generate a time input for time attributes' do
with_input_for @user, :delivery_time, :time
assert_select 'input[type="time"]'
end
test 'input should generate a time select for time attributes if HTML5 compatibility is explicitly disabled' do
with_input_for @user, :delivery_time, :time, html5: false
assert_select 'select.time'
end
test 'input should generate required html attribute' do
with_input_for @user, :delivery_time, :time, required: true
assert_select 'input.required'
assert_select 'input[required]'
end
test 'input should have an aria-required html attribute' do
with_input_for @user, :delivery_time, :time, required: true
assert_select 'input[aria-required=true]'
end
end
# Tests for datetime, date and time inputs when HTML5 compatibility is enabled in the wrapper.
class DateTimeInputWithoutHtml5Test < ActionView::TestCase
test 'input should generate a datetime select by default for datetime attributes' do
swap_wrapper do
with_input_for @user, :created_at, :datetime
1.upto(5) do |i|
assert_select "form select.datetime#user_created_at_#{i}i"
end
end
end
test 'input should be able to pass options to datetime select' do
with_input_for @user, :created_at, :datetime,
with_input_for @user, :created_at, :datetime, html5: false,
disabled: true, prompt: { year: 'ano', month: 'mês', day: 'dia' }
assert_select 'select.datetime[disabled=disabled]'
@ -21,16 +72,26 @@ class DateTimeInputTest < ActionView::TestCase
assert_select 'select.datetime option', 'dia'
end
test 'input should generate a datetime input for datetime attributes if HTML5 compatibility is explicitly enabled' do
swap_wrapper do
with_input_for @user, :created_at, :datetime, html5: true
assert_select 'input[type="datetime"]'
end
end
test 'input should generate a date select for date attributes' do
with_input_for @user, :born_at, :date
assert_select 'select.date#user_born_at_1i'
assert_select 'select.date#user_born_at_2i'
assert_select 'select.date#user_born_at_3i'
assert_no_select 'select.date#user_born_at_4i'
swap_wrapper do
with_input_for @user, :born_at, :date
assert_select 'select.date#user_born_at_1i'
assert_select 'select.date#user_born_at_2i'
assert_select 'select.date#user_born_at_3i'
assert_no_select 'select.date#user_born_at_4i'
end
end
test 'input should be able to pass options to date select' do
with_input_for @user, :born_at, :date, as: :date,
with_input_for @user, :born_at, :date, as: :date, html5: false,
disabled: true, prompt: { year: 'ano', month: 'mês', day: 'dia' }
assert_select 'select.date[disabled=disabled]'
@ -40,21 +101,31 @@ class DateTimeInputTest < ActionView::TestCase
end
test 'input should be able to pass :default to date select' do
with_input_for @user, :born_at, :date, default: Date.today
with_input_for @user, :born_at, :date, default: Date.today, html5: false
assert_select "select.date option[value=#{Date.today.year}][selected=selected]"
end
test 'input should generate a date input for date attributes if HTML5 compatibility is explicitly enabled' do
swap_wrapper do
with_input_for @user, :born_at, :date, html5: true
assert_select 'input[type="date"]'
end
end
test 'input should generate a time select for time attributes' do
with_input_for @user, :delivery_time, :time
assert_select 'input[type=hidden]#user_delivery_time_1i'
assert_select 'input[type=hidden]#user_delivery_time_2i'
assert_select 'input[type=hidden]#user_delivery_time_3i'
assert_select 'select.time#user_delivery_time_4i'
assert_select 'select.time#user_delivery_time_5i'
swap_wrapper do
with_input_for @user, :delivery_time, :time
assert_select 'input[type=hidden]#user_delivery_time_1i'
assert_select 'input[type=hidden]#user_delivery_time_2i'
assert_select 'input[type=hidden]#user_delivery_time_3i'
assert_select 'select.time#user_delivery_time_4i'
assert_select 'select.time#user_delivery_time_5i'
end
end
test 'input should be able to pass options to time select' do
with_input_for @user, :delivery_time, :time, required: true,
with_input_for @user, :delivery_time, :time, required: true, html5: false,
disabled: true, prompt: { hour: 'hora', minute: 'minuto' }
assert_select 'select.time[disabled=disabled]'
@ -62,43 +133,53 @@ class DateTimeInputTest < ActionView::TestCase
assert_select 'select.time option', 'minuto'
end
test 'input should generate a time input for time attributes if HTML5 compatibility is explicitly enabled' do
swap_wrapper do
with_input_for @user, :delivery_time, :time, html5: true
assert_select 'input[type="time"]'
end
end
test 'label should use i18n to get target for date input type' do
store_translations(:en, date: { order: ['month', 'day', 'year'] }) do
with_input_for :project, :created_at, :date
with_input_for :project, :created_at, :date, html5: false
assert_select 'label[for=project_created_at_2i]'
end
end
test 'label should use i18n to get target for datetime input type' do
store_translations(:en, date: { order: ['month', 'day', 'year'] }) do
with_input_for :project, :created_at, :datetime
with_input_for :project, :created_at, :datetime, html5: false
assert_select 'label[for=project_created_at_2i]'
end
end
test 'label should use order to get target when date input type' do
with_input_for :project, :created_at, :date, order: ['month', 'year', 'day']
with_input_for :project, :created_at, :date, order: ['month', 'year', 'day'], html5: false
assert_select 'label[for=project_created_at_2i]'
end
test 'label should use order to get target when datetime input type' do
with_input_for :project, :created_at, :datetime, order: ['month', 'year', 'day']
with_input_for :project, :created_at, :datetime, order: ['month', 'year', 'day'], html5: false
assert_select 'label[for=project_created_at_2i]'
end
test 'label should point to first option when time input type' do
with_input_for :project, :created_at, :time
with_input_for :project, :created_at, :time, html5: false
assert_select 'label[for=project_created_at_4i]'
end
test 'date time input should generate required html attribute' do
with_input_for @user, :delivery_time, :time, required: true
skip
with_input_for @user, :delivery_time, :time, required: true, html5: false
assert_select 'select.required'
assert_select 'select[required]'
end
test 'date time input has an aria-required html attribute' do
with_input_for @user, :delivery_time, :time, required: true
skip
with_input_for @user, :delivery_time, :time, required: true, html5: false
assert_select 'select.required'
assert_select 'select[aria-required=true]'
end