date_select and datetime_select take a :default option. Closes #7052.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6080 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
ad29870c21
commit
d6d94c7377
|
@ -1,5 +1,9 @@
|
|||
*SVN*
|
||||
|
||||
* date_select and datetime_select take a :default option. #7052 [nik.wakelin]
|
||||
date_select "post", "written_on", :default => 3.days.from_now
|
||||
date_select "credit_card", "bill_due", :default => { :day => 20 }
|
||||
|
||||
* select :multiple => true suffixes the attribute name with [] unless already suffixed. #6977 [nik.kakelin, ben, julik]
|
||||
|
||||
* Improve routes documentation. #7095 [zackchandler]
|
||||
|
|
|
@ -90,6 +90,8 @@ module ActionView
|
|||
# set the order of the tags using the <tt>:order</tt> option with an array of symbols <tt>:year</tt>, <tt>:month</tt> and <tt>:day</tt> in
|
||||
# the desired order. Symbols may be omitted and the respective select is not included.
|
||||
#
|
||||
# Pass the <tt>:default</tt> option to set the default date. Use a Time object or a Hash of :year, :month, :day, :hour, :minute, and :second.
|
||||
#
|
||||
# Passing :disabled => true as part of the +options+ will make elements inaccessible for change.
|
||||
#
|
||||
# NOTE: Discarded selects will default to 1. So if no month select is available, January will be assumed.
|
||||
|
@ -103,6 +105,9 @@ module ActionView
|
|||
# date_select("post", "written_on", :order => [:day, :month, :year])
|
||||
# date_select("user", "birthday", :order => [:month, :day])
|
||||
#
|
||||
# date_select("post", "written_on", :default => 3.days.from_now)
|
||||
# date_select("credit_card", "bill_due", :default => { :day => 20 })
|
||||
#
|
||||
# The selects are prepared for multi-parameter assignment to an Active Record object.
|
||||
def date_select(object_name, method, options = {})
|
||||
InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_date_select_tag(options)
|
||||
|
@ -361,7 +366,7 @@ module ActionView
|
|||
defaults = { :discard_type => true }
|
||||
options = defaults.merge(options)
|
||||
datetime = value(object)
|
||||
datetime ||= Time.now unless options[:include_blank]
|
||||
datetime ||= default_time_from_options(options[:default]) unless options[:include_blank]
|
||||
|
||||
position = { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 }
|
||||
|
||||
|
@ -410,6 +415,26 @@ module ActionView
|
|||
end
|
||||
options.merge(:prefix => "#{prefix}[#{@method_name}(#{position}i)]")
|
||||
end
|
||||
|
||||
def default_time_from_options(default)
|
||||
case default
|
||||
when nil
|
||||
Time.now
|
||||
when Date, Time
|
||||
default
|
||||
else
|
||||
# Rename :minute and :second to :min and :sec
|
||||
default[:min] ||= default[:minute]
|
||||
default[:sec] ||= default[:second]
|
||||
|
||||
[:year, :month, :day, :hour, :min, :sec].each do |key|
|
||||
default[key] ||= Time.now.send(key)
|
||||
end
|
||||
|
||||
Time.mktime(default[:year], default[:month], default[:day],
|
||||
default[:hour], default[:min], default[:sec])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class FormBuilder
|
||||
|
|
|
@ -1318,4 +1318,78 @@ class DateHelperTest < Test::Unit::TestCase
|
|||
|
||||
assert_equal expected, datetime_select("post", "updated_at", :order => [:day, :month])
|
||||
end
|
||||
|
||||
def test_datetime_select_with_default_value_as_time
|
||||
@post = Post.new
|
||||
@post.updated_at = nil
|
||||
|
||||
expected = %{<select id="post_updated_at_1i" name="post[updated_at(1i)]">\n}
|
||||
2001.upto(2011) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 2006}>#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_2i" name="post[updated_at(2i)]">\n}
|
||||
1.upto(12) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 9}>#{Date::MONTHNAMES[i]}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_3i" name="post[updated_at(3i)]">\n}
|
||||
1.upto(31) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 19}>#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
|
||||
expected << " — "
|
||||
|
||||
expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
|
||||
0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << " : "
|
||||
expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
|
||||
0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
|
||||
assert_equal expected, datetime_select("post", "updated_at", :default => Time.local(2006, 9, 19, 15, 16, 35))
|
||||
end
|
||||
|
||||
def test_include_blank_overrides_default_option
|
||||
@post = Post.new
|
||||
@post.updated_at = nil
|
||||
|
||||
expected = %{<select id="post_updated_at_1i" name="post[updated_at(1i)]">\n}
|
||||
expected << %(<option value=""></option>\n)
|
||||
2002.upto(2012) { |i| expected << %(<option value="#{i}">#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_2i" name="post[updated_at(2i)]">\n}
|
||||
expected << %(<option value=""></option>\n)
|
||||
1.upto(12) { |i| expected << %(<option value="#{i}">#{Date::MONTHNAMES[i]}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_3i" name="post[updated_at(3i)]">\n}
|
||||
expected << %(<option value=""></option>\n)
|
||||
1.upto(31) { |i| expected << %(<option value="#{i}">#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
|
||||
assert_equal expected, date_select("post", "updated_at", :default => Time.local(2006, 9, 19, 15, 16, 35), :include_blank => true)
|
||||
end
|
||||
|
||||
def test_datetime_select_with_default_value_as_hash
|
||||
@post = Post.new
|
||||
@post.updated_at = nil
|
||||
|
||||
expected = %{<select id="post_updated_at_1i" name="post[updated_at(1i)]">\n}
|
||||
(Time.now.year - 5).upto(Time.now.year + 5) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == Time.now.year}>#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_2i" name="post[updated_at(2i)]">\n}
|
||||
1.upto(12) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == 10}>#{Date::MONTHNAMES[i]}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << %{<select id="post_updated_at_3i" name="post[updated_at(3i)]">\n}
|
||||
1.upto(31) { |i| expected << %(<option value="#{i}"#{' selected="selected"' if i == Time.now.day}>#{i}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
|
||||
expected << " — "
|
||||
|
||||
expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
|
||||
0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 9}>#{leading_zero_on_single_digits(i)}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
expected << " : "
|
||||
expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
|
||||
0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 42}>#{leading_zero_on_single_digits(i)}</option>\n) }
|
||||
expected << "</select>\n"
|
||||
|
||||
assert_equal expected, datetime_select("post", "updated_at", :default => { :month => 10, :minute => 42, :hour => 9 })
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue