mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #5503 from jeyb/leap_day_time_date_time_selector
Fixes issue #5222: DateTimeSelector builds invalid dates on leap days
This commit is contained in:
commit
09d884cd2c
3 changed files with 27 additions and 13 deletions
|
@ -674,9 +674,9 @@ module ActionView
|
||||||
@options[:discard_minute] ||= true if @options[:discard_hour]
|
@options[:discard_minute] ||= true if @options[:discard_hour]
|
||||||
@options[:discard_second] ||= true unless @options[:include_seconds] && !@options[:discard_minute]
|
@options[:discard_second] ||= true unless @options[:include_seconds] && !@options[:discard_minute]
|
||||||
|
|
||||||
# If the day is hidden and the month is visible, the day should be set to the 1st so all month choices are
|
# If the day is hidden, the day should be set to the 1st so all month and year choices are valid. Otherwise,
|
||||||
# valid (otherwise it could be 31 and February wouldn't be a valid date)
|
# February 31st or February 29th, 2011 can be selected, which are invalid.
|
||||||
if @datetime && @options[:discard_day] && !@options[:discard_month]
|
if @datetime && @options[:discard_day]
|
||||||
@datetime = @datetime.change(:day => 1)
|
@datetime = @datetime.change(:day => 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -701,9 +701,9 @@ module ActionView
|
||||||
@options[:discard_month] ||= true unless order.include?(:month)
|
@options[:discard_month] ||= true unless order.include?(:month)
|
||||||
@options[:discard_day] ||= true if @options[:discard_month] || !order.include?(:day)
|
@options[:discard_day] ||= true if @options[:discard_month] || !order.include?(:day)
|
||||||
|
|
||||||
# If the day is hidden and the month is visible, the day should be set to the 1st so all month choices are
|
# If the day is hidden, the day should be set to the 1st so all month and year choices are valid. Otherwise,
|
||||||
# valid (otherwise it could be 31 and February wouldn't be a valid date)
|
# February 31st or February 29th, 2011 can be selected, which are invalid.
|
||||||
if @datetime && @options[:discard_day] && !@options[:discard_month]
|
if @datetime && @options[:discard_day]
|
||||||
@datetime = @datetime.change(:day => 1)
|
@datetime = @datetime.change(:day => 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -43,14 +43,14 @@ class ActiveModelHelperTest < ActionView::TestCase
|
||||||
|
|
||||||
def test_date_select_with_errors
|
def test_date_select_with_errors
|
||||||
assert_dom_equal(
|
assert_dom_equal(
|
||||||
%(<div class="field_with_errors"><select id="post_updated_at_1i" name="post[updated_at(1i)]">\n<option selected="selected" value="2004">2004</option>\n<option value="2005">2005</option>\n</select>\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="15" />\n</div>),
|
%(<div class="field_with_errors"><select id="post_updated_at_1i" name="post[updated_at(1i)]">\n<option selected="selected" value="2004">2004</option>\n<option value="2005">2005</option>\n</select>\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" />\n</div>),
|
||||||
date_select("post", "updated_at", :discard_month => true, :discard_day => true, :start_year => 2004, :end_year => 2005)
|
date_select("post", "updated_at", :discard_month => true, :discard_day => true, :start_year => 2004, :end_year => 2005)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_datetime_select_with_errors
|
def test_datetime_select_with_errors
|
||||||
assert_dom_equal(
|
assert_dom_equal(
|
||||||
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="15" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
|
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
|
||||||
datetime_select("post", "updated_at", :discard_year => true, :discard_month => true, :discard_day => true, :minute_step => 60)
|
datetime_select("post", "updated_at", :discard_year => true, :discard_month => true, :discard_day => true, :minute_step => 60)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -711,7 +711,7 @@ class DateHelperTest < ActionView::TestCase
|
||||||
# Since the order is incomplete nothing will be shown
|
# Since the order is incomplete nothing will be shown
|
||||||
expected = %(<input id="date_first_year" name="date[first][year]" type="hidden" value="2003" />\n)
|
expected = %(<input id="date_first_year" name="date[first][year]" type="hidden" value="2003" />\n)
|
||||||
expected << %(<input id="date_first_month" name="date[first][month]" type="hidden" value="8" />\n)
|
expected << %(<input id="date_first_month" name="date[first][month]" type="hidden" value="8" />\n)
|
||||||
expected << %(<input id="date_first_day" name="date[first][day]" type="hidden" value="16" />\n)
|
expected << %(<input id="date_first_day" name="date[first][day]" type="hidden" value="1" />\n)
|
||||||
|
|
||||||
assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :order => [:day])
|
assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :order => [:day])
|
||||||
end
|
end
|
||||||
|
@ -943,7 +943,7 @@ class DateHelperTest < ActionView::TestCase
|
||||||
expected << "</select>\n"
|
expected << "</select>\n"
|
||||||
|
|
||||||
expected << %(<input type="hidden" id="date_first_month" name="date[first][month]" value="8" />\n)
|
expected << %(<input type="hidden" id="date_first_month" name="date[first][month]" value="8" />\n)
|
||||||
expected << %(<input type="hidden" id="date_first_day" name="date[first][day]" value="16" />\n)
|
expected << %(<input type="hidden" id="date_first_day" name="date[first][day]" value="1" />\n)
|
||||||
|
|
||||||
assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), { :date_separator => " / ", :discard_month => true, :discard_day => true, :start_year => 2003, :end_year => 2005, :prefix => "date[first]"})
|
assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), { :date_separator => " / ", :discard_month => true, :discard_day => true, :start_year => 2003, :end_year => 2005, :prefix => "date[first]"})
|
||||||
end
|
end
|
||||||
|
@ -1396,6 +1396,20 @@ class DateHelperTest < ActionView::TestCase
|
||||||
assert_dom_equal expected, date_select("post", "written_on", :order => [ :month, :year ])
|
assert_dom_equal expected, date_select("post", "written_on", :order => [ :month, :year ])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_date_select_without_day_and_month
|
||||||
|
@post = Post.new
|
||||||
|
@post.written_on = Date.new(2004, 2, 29)
|
||||||
|
|
||||||
|
expected = "<input type=\"hidden\" id=\"post_written_on_2i\" name=\"post[written_on(2i)]\" value=\"2\" />\n"
|
||||||
|
expected << "<input type=\"hidden\" id=\"post_written_on_3i\" name=\"post[written_on(3i)]\" value=\"1\" />\n"
|
||||||
|
|
||||||
|
expected << %{<select id="post_written_on_1i" name="post[written_on(1i)]">\n}
|
||||||
|
expected << %{<option value="1999">1999</option>\n<option value="2000">2000</option>\n<option value="2001">2001</option>\n<option value="2002">2002</option>\n<option value="2003">2003</option>\n<option value="2004" selected="selected">2004</option>\n<option value="2005">2005</option>\n<option value="2006">2006</option>\n<option value="2007">2007</option>\n<option value="2008">2008</option>\n<option value="2009">2009</option>\n}
|
||||||
|
expected << "</select>\n"
|
||||||
|
|
||||||
|
assert_dom_equal expected, date_select("post", "written_on", :order => [ :year ])
|
||||||
|
end
|
||||||
|
|
||||||
def test_date_select_without_day_with_separator
|
def test_date_select_without_day_with_separator
|
||||||
@post = Post.new
|
@post = Post.new
|
||||||
@post.written_on = Date.new(2004, 6, 15)
|
@post.written_on = Date.new(2004, 6, 15)
|
||||||
|
@ -2427,7 +2441,7 @@ class DateHelperTest < ActionView::TestCase
|
||||||
1999.upto(2009) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 2004}>#{i}</option>\n) }
|
1999.upto(2009) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 2004}>#{i}</option>\n) }
|
||||||
expected << "</select>\n"
|
expected << "</select>\n"
|
||||||
expected << %{<input type="hidden" id="post_updated_at_2i" name="post[updated_at(2i)]" value="6" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_2i" name="post[updated_at(2i)]" value="6" />\n}
|
||||||
expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="15" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="1" />\n}
|
||||||
|
|
||||||
expected << " — "
|
expected << " — "
|
||||||
|
|
||||||
|
@ -2448,7 +2462,7 @@ class DateHelperTest < ActionView::TestCase
|
||||||
|
|
||||||
expected = %{<input type="hidden" id="post_updated_at_1i" name="post[updated_at(1i)]" value="2004" />\n}
|
expected = %{<input type="hidden" id="post_updated_at_1i" name="post[updated_at(1i)]" value="2004" />\n}
|
||||||
expected << %{<input type="hidden" id="post_updated_at_2i" name="post[updated_at(2i)]" value="6" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_2i" name="post[updated_at(2i)]" value="6" />\n}
|
||||||
expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="15" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="1" />\n}
|
||||||
|
|
||||||
expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
|
expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
|
||||||
0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
|
0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
|
||||||
|
@ -2467,7 +2481,7 @@ class DateHelperTest < ActionView::TestCase
|
||||||
|
|
||||||
expected = %{<input type="hidden" id="post_updated_at_1i" disabled="disabled" name="post[updated_at(1i)]" value="2004" />\n}
|
expected = %{<input type="hidden" id="post_updated_at_1i" disabled="disabled" name="post[updated_at(1i)]" value="2004" />\n}
|
||||||
expected << %{<input type="hidden" id="post_updated_at_2i" disabled="disabled" name="post[updated_at(2i)]" value="6" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_2i" disabled="disabled" name="post[updated_at(2i)]" value="6" />\n}
|
||||||
expected << %{<input type="hidden" id="post_updated_at_3i" disabled="disabled" name="post[updated_at(3i)]" value="15" />\n}
|
expected << %{<input type="hidden" id="post_updated_at_3i" disabled="disabled" name="post[updated_at(3i)]" value="1" />\n}
|
||||||
|
|
||||||
expected << %{<select id="post_updated_at_4i" disabled="disabled" name="post[updated_at(4i)]">\n}
|
expected << %{<select id="post_updated_at_4i" disabled="disabled" name="post[updated_at(4i)]">\n}
|
||||||
0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
|
0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
|
||||||
|
|
Loading…
Reference in a new issue