Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8968

Show
Ignore:
Timestamp:
03/02/08 04:40:54 (6 months ago)
Author:
nzkoz
Message:

Allow html_options to be passed to all the date helpers. Closes #6000 [h-lame, Jakob S]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/lib/action_view/helpers/active_record_helper.rb

    r8626 r8968  
    221221 
    222222      alias_method :to_date_select_tag_without_error_wrapping, :to_date_select_tag 
    223       def to_date_select_tag(options = {}
    224         if object.respond_to?("errors") && object.errors.respond_to?("on") 
    225           error_wrapping(to_date_select_tag_without_error_wrapping(options), object.errors.on(@method_name)) 
    226         else 
    227           to_date_select_tag_without_error_wrapping(options
     223      def to_date_select_tag(options = {}, html_options = {}
     224        if object.respond_to?("errors") && object.errors.respond_to?("on") 
     225          error_wrapping(to_date_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name)) 
     226        else 
     227          to_date_select_tag_without_error_wrapping(options, html_options
    228228        end 
    229229      end 
    230230 
    231231      alias_method :to_datetime_select_tag_without_error_wrapping, :to_datetime_select_tag 
    232       def to_datetime_select_tag(options = {}
    233         if object.respond_to?("errors") && object.errors.respond_to?("on") 
    234             error_wrapping(to_datetime_select_tag_without_error_wrapping(options), object.errors.on(@method_name)) 
     232      def to_datetime_select_tag(options = {}, html_options = {}
     233        if object.respond_to?("errors") && object.errors.respond_to?("on") 
     234            error_wrapping(to_datetime_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name)) 
    235235          else 
    236             to_datetime_select_tag_without_error_wrapping(options
     236            to_datetime_select_tag_without_error_wrapping(options, html_options
    237237        end 
    238238      end 
    239239 
    240240      alias_method :to_time_select_tag_without_error_wrapping, :to_time_select_tag 
    241       def to_time_select_tag(options = {}
    242         if object.respond_to?("errors") && object.errors.respond_to?("on") 
    243           error_wrapping(to_time_select_tag_without_error_wrapping(options), object.errors.on(@method_name)) 
    244         else 
    245           to_time_select_tag_without_error_wrapping(options
     241      def to_time_select_tag(options = {}, html_options = {}
     242        if object.respond_to?("errors") && object.errors.respond_to?("on") 
     243          error_wrapping(to_time_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name)) 
     244        else 
     245          to_time_select_tag_without_error_wrapping(options, html_options
    246246        end 
    247247      end 
  • trunk/actionpack/lib/action_view/helpers/date_helper.rb

    r8911 r8968  
    115115      # Passing :disabled => true as part of the +options+ will make elements inaccessible for change. 
    116116      # 
     117      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
     118      # 
    117119      # NOTE: Discarded selects will default to 1. So if no month select is available, January will be assumed. 
    118120      # 
     
    151153      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that all month 
    152154      # choices are valid. 
    153       def date_select(object_name, method, options = {}
    154         InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_date_select_tag(options
     155      def date_select(object_name, method, options = {}, html_options = {}
     156        InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_date_select_tag(options, html_options
    155157      end 
    156158 
     
    159161      # You can include the seconds with <tt>:include_seconds</tt>. 
    160162      #  
     163      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
     164      # 
    161165      # ==== Examples 
    162166      #   # Creates a time select tag that, when POSTed, will be stored in the post variable in the sunrise attribute 
     
    184188      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that all month 
    185189      # choices are valid. 
    186       def time_select(object_name, method, options = {}
    187         InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_time_select_tag(options
     190      def time_select(object_name, method, options = {}, html_options = {}
     191        InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_time_select_tag(options, html_options
    188192      end 
    189193 
    190194      # Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a specified datetime-based 
    191195      # attribute (identified by +method+) on an object assigned to the template (identified by +object+). Examples: 
     196      # 
     197      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
    192198      # 
    193199      # ==== Examples 
     
    208214      # 
    209215      # The selects are prepared for multi-parameter assignment to an Active Record object. 
    210       def datetime_select(object_name, method, options = {}
    211         InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_datetime_select_tag(options
     216      def datetime_select(object_name, method, options = {}, html_options = {}
     217        InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_datetime_select_tag(options, html_options
    212218      end 
    213219 
     
    218224      # keys to the +options+ to control visual display of the elements. 
    219225      # 
     226      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
     227      # 
    220228      # ==== Examples 
    221229      #   my_date_time = Time.now + 4.days 
     
    243251      #   select_datetime(my_date_time, :prefix => 'payday') 
    244252      # 
    245       def select_datetime(datetime = Time.now, options = {}
     253      def select_datetime(datetime = Time.now, options = {}, html_options = {}
    246254        separator = options[:datetime_separator] || '' 
    247         select_date(datetime, options) + separator + select_time(datetime, options) 
     255        select_date(datetime, options, html_options) + separator + select_time(datetime, options, html_options) 
    248256       end 
    249257 
     
    253261      # will be appended onto the <tt>:order</tt> passed in. 
    254262      # 
     263      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
     264      # 
    255265      # ==== Examples 
    256266      #   my_date = Time.today + 6.days 
     
    274284      #   select_datetime(my_date_time, :prefix => 'payday') 
    275285      # 
    276       def select_date(date = Date.today, options = {}
     286      def select_date(date = Date.today, options = {}, html_options = {}
    277287        options[:order] ||= [] 
    278288        [:year, :month, :day].each { |o| options[:order].push(o) unless options[:order].include?(o) } 
     
    280290        select_date = '' 
    281291        options[:order].each do |o| 
    282           select_date << self.send("select_#{o}", date, options
     292          select_date << self.send("select_#{o}", date, options, html_options
    283293        end 
    284294        select_date 
     
    289299      # the <tt>:include_seconds</tt> option to include an input for seconds. 
    290300      # 
     301      # If anything is passed in the html_options hash it will be applied to every select tag in the set. 
     302      # 
    291303      # ==== Examples 
    292304      #   my_time = Time.now + 5.days + 7.hours + 3.minutes + 14.seconds 
     
    310322      #   select_time(my_time, :time_separator => ':', :include_seconds => true) 
    311323      # 
    312       def select_time(datetime = Time.now, options = {}
     324      def select_time(datetime = Time.now, options = {}, html_options = {}
    313325        separator = options[:time_separator] || '' 
    314         select_hour(datetime, options) + separator + select_minute(datetime, options) + (options[:include_seconds] ? separator + select_second(datetime, options) : '') 
     326        select_hour(datetime, options, html_options) + separator + select_minute(datetime, options, html_options) + (options[:include_seconds] ? separator + select_second(datetime, options, html_options) : '') 
    315327      end 
    316328 
     
    332344      #   select_second(my_time, :field_name => 'interval') 
    333345      # 
    334       def select_second(datetime, options = {}
     346      def select_second(datetime, options = {}, html_options = {}
    335347        val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.sec) : '' 
    336348        if options[:use_hidden] 
     
    345357            second_options << "\n" 
    346358          end 
    347           select_html(options[:field_name] || 'second', second_options.join, options
     359          select_html(options[:field_name] || 'second', second_options.join, options, html_options
    348360        end 
    349361      end 
     
    367379      #   select_minute(my_time, :field_name => 'stride') 
    368380      # 
    369       def select_minute(datetime, options = {}
     381      def select_minute(datetime, options = {}, html_options = {}
    370382        val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.min) : '' 
    371383        if options[:use_hidden] 
     
    380392            minute_options << "\n" 
    381393          end 
    382           select_html(options[:field_name] || 'minute', minute_options.join, options
     394          select_html(options[:field_name] || 'minute', minute_options.join, options, html_options
    383395         end 
    384396      end 
     
    401413      #   select_minute(my_time, :field_name => 'stride') 
    402414      # 
    403       def select_hour(datetime, options = {}
     415      def select_hour(datetime, options = {}, html_options = {}
    404416        val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.hour) : '' 
    405417        if options[:use_hidden] 
     
    414426            hour_options << "\n" 
    415427          end 
    416           select_html(options[:field_name] || 'hour', hour_options.join, options
     428          select_html(options[:field_name] || 'hour', hour_options.join, options, html_options
    417429        end 
    418430      end 
     
    435447      #   select_day(my_time, :field_name => 'due') 
    436448      # 
    437       def select_day(date, options = {}
     449      def select_day(date, options = {}, html_options = {}
    438450        val = date ? (date.kind_of?(Fixnum) ? date : date.day) : '' 
    439451        if options[:use_hidden] 
     
    448460            day_options << "\n" 
    449461          end 
    450           select_html(options[:field_name] || 'day', day_options.join, options
     462          select_html(options[:field_name] || 'day', day_options.join, options, html_options
    451463        end 
    452464      end 
     
    486498      #   select_month(Date.today, :use_month_names => %w(Januar Februar Marts ...)) 
    487499      # 
    488       def select_month(date, options = {}
     500      def select_month(date, options = {}, html_options = {}
    489501        val = date ? (date.kind_of?(Fixnum) ? date : date.month) : '' 
    490502        if options[:use_hidden] 
     
    509521            month_options << "\n" 
    510522          end 
    511           select_html(options[:field_name] || 'month', month_options.join, options
     523          select_html(options[:field_name] || 'month', month_options.join, options, html_options
    512524        end 
    513525      end 
     
    535547      #   select_year(2006, :start_year => 2000, :end_year => 2010) 
    536548      # 
    537       def select_year(date, options = {}
     549      def select_year(date, options = {}, html_options = {}
    538550        val = date ? (date.kind_of?(Fixnum) ? date : date.year) : '' 
    539551        if options[:use_hidden] 
     
    552564            year_options << "\n" 
    553565          end 
    554           select_html(options[:field_name] || 'year', year_options.join, options
     566          select_html(options[:field_name] || 'year', year_options.join, options, html_options
    555567        end 
    556568      end 
     
    558570      private 
    559571 
    560         def select_html(type, html_options, options
     572        def select_html(type, html_options, options, select_tag_options = {}
    561573          name_and_id_from_options(options, type) 
    562574          select_options = {:id => options[:id], :name => options[:name]} 
    563575          select_options.merge!(:disabled => 'disabled') if options[:disabled] 
     576          select_options.merge!(select_tag_options) unless select_tag_options.empty? 
    564577          select_html = "\n" 
    565578          select_html << content_tag(:option, '', :value => '') + "\n" if options[:include_blank] 
     
    586599      include DateHelper 
    587600 
    588       def to_date_select_tag(options = {}
    589         date_or_time_select(options.merge(:discard_hour => true)
    590       end 
    591  
    592       def to_time_select_tag(options = {}
    593         date_or_time_select options.merge(:discard_year => true, :discard_month => true
    594       end 
    595  
    596       def to_datetime_select_tag(options = {}
    597         date_or_time_select options 
     601      def to_date_select_tag(options = {}, html_options = {}
     602        date_or_time_select(options.merge(:discard_hour => true), html_options
     603      end 
     604 
     605      def to_time_select_tag(options = {}, html_options = {}
     606        date_or_time_select(options.merge(:discard_year => true, :discard_month => true), html_options
     607      end 
     608 
     609      def to_datetime_select_tag(options = {}, html_options = {}
     610        date_or_time_select(options, html_options) 
    598611      end 
    599612 
    600613      private 
    601         def date_or_time_select(options
     614        def date_or_time_select(options, html_options = {}
    602615          defaults = { :discard_type => true } 
    603616          options  = defaults.merge(options) 
     
    636649            next if discard[param] && date_or_time_select.empty? 
    637650 
    638             date_or_time_select.insert(0, self.send("select_#{param}", datetime, options_with_prefix(position[param], options.merge(:use_hidden => discard[param])))) 
     651            date_or_time_select.insert(0, self.send("select_#{param}", datetime, options_with_prefix(position[param], options.merge(:use_hidden => discard[param])), html_options)) 
    639652            date_or_time_select.insert(0, 
    640653              case param 
     
    682695 
    683696    class FormBuilder 
    684       def date_select(method, options = {}
     697      def date_select(method, options = {}, html_options = {}
    685698        @template.date_select(@object_name, method, options.merge(:object => @object)) 
    686699      end 
    687700 
    688       def time_select(method, options = {}
     701      def time_select(method, options = {}, html_options = {}
    689702        @template.time_select(@object_name, method, options.merge(:object => @object)) 
    690703      end 
    691704 
    692       def datetime_select(method, options = {}
     705      def datetime_select(method, options = {}, html_options = {}
    693706        @template.datetime_select(@object_name, method, options.merge(:object => @object)) 
    694707      end 
  • trunk/actionpack/test/template/date_helper_test.rb

    r8911 r8968  
    146146  end 
    147147 
     148  def test_select_day_with_html_options 
     149    expected = %(<select id="date_day" name="date[day]" class="selector">\n) 
     150    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n) 
     151    expected << "</select>\n" 
     152 
     153    assert_dom_equal expected, select_day(Time.mktime(2003, 8, 16), {}, :class => 'selector') 
     154    assert_dom_equal expected, select_day(16, {}, :class => 'selector') 
     155  end 
     156 
    148157  def test_select_month 
    149158    expected = %(<select id="date_month" name="date[month]">\n) 
     
    254263  def test_select_month_with_hidden_and_field_name 
    255264    assert_dom_equal "<input type=\"hidden\" id=\"date_mois\" name=\"date[mois]\" value=\"8\" />\n", select_month(8, :use_hidden => true, :field_name => 'mois') 
     265  end 
     266 
     267  def test_select_month_with_html_options 
     268    expected = %(<select id="date_month" name="date[month]" class="selector" accesskey="M">\n) 
     269    expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n) 
     270    expected << "</select>\n" 
     271 
     272    assert_dom_equal expected, select_month(Time.mktime(2003, 8, 16), {}, :class => 'selector', :accesskey => 'M') 
     273    #result = select_month(Time.mktime(2003, 8, 16), {}, :class => 'selector', :accesskey => 'M') 
     274    #assert result.include?('<select id="date_month" name="date[month]"') 
     275    #assert result.include?('class="selector"') 
     276    #assert result.include?('accesskey="M"') 
     277    #assert result.include?('<option value="1">January') 
    256278  end 
    257279 
     
    311333  end 
    312334 
     335  def test_select_year_with_html_options 
     336    expected = %(<select id="date_year" name="date[year]" class="selector" accesskey="M">\n) 
     337    expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n) 
     338    expected << "</select>\n" 
     339 
     340    assert_dom_equal expected, select_year(Time.mktime(2003, 8, 16), {:start_year => 2003, :end_year => 2005}, :class => 'selector', :accesskey => 'M') 
     341    #result = select_year(Time.mktime(2003, 8, 16), {:start_year => 2003, :end_year => 2005}, :class => 'selector', :accesskey => 'M') 
     342    #assert result.include?('<select id="date_year" name="date[year]"') 
     343    #assert result.include?('class="selector"') 
     344    #assert result.include?('accesskey="M"') 
     345    #assert result.include?('<option value="2003"') 
     346  end 
     347 
    313348  def test_select_hour 
    314349    expected = %(<select id="date_hour" name="date[hour]">\n) 
     
    351386  end 
    352387 
     388  def test_select_hour_with_html_options 
     389    expected = %(<select id="date_hour" name="date[hour]" class="selector" accesskey="M">\n) 
     390    expected << %(<option 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" selected="selected">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) 
     391    expected << "</select>\n" 
     392 
     393    assert_dom_equal expected, select_hour(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector', :accesskey => 'M') 
     394  end 
     395 
    353396  def test_select_minute 
    354397    expected = %(<select id="date_minute" name="date[minute]">\n) 
     
    415458  end 
    416459 
     460  def test_select_minute_with_html_options 
     461    expected = expected = %(<select id="date_minute" name="date[minute]" class="selector" accesskey="M">\n) 
     462    expected << %(<option 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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n) 
     463    expected << "</select>\n" 
     464 
     465    assert_dom_equal expected, select_minute(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector', :accesskey => 'M') 
     466 
     467    #result = select_minute(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector', :accesskey => 'M') 
     468    #assert result.include?('<select id="date_minute" name="date[minute]"') 
     469    #assert result.include?('class="selector"') 
     470    #assert result.include?('accesskey="M"') 
     471    #assert result.include?('<option value="00">00') 
     472  end 
     473 
    417474  def test_select_second 
    418475    expected = %(<select id="date_second" name="date[second]">\n) 
     
    453510 
    454511    assert_dom_equal expected, select_second(nil, :include_blank => true) 
     512  end 
     513 
     514  def test_select_second_with_html_options 
     515    expected = %(<select id="date_second" name="date[second]" class="selector" accesskey="M">\n) 
     516    expected << %(<option 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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n) 
     517    expected << "</select>\n" 
     518 
     519    assert_dom_equal expected, select_second(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector', :accesskey => 'M') 
     520 
     521    #result = select_second(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector', :accesskey => 'M') 
     522    #assert result.include?('<select id="date_second" name="date[second]"') 
     523    #assert result.include?('class="selector"') 
     524    #assert result.include?('accesskey="M"') 
     525    #assert result.include?('<option value="00">00') 
    455526  end 
    456527 
     
    672743  end 
    673744 
     745  def test_select_date_with_html_options 
     746    expected =  %(<select id="date_first_year" name="date[first][year]" class="selector">\n) 
     747    expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n) 
     748    expected << "</select>\n" 
     749 
     750    expected << %(<select id="date_first_month" name="date[first][month]" class="selector">\n) 
     751    expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n) 
     752    expected << "</select>\n" 
     753 
     754    expected << %(<select id="date_first_day" name="date[first][day]" class="selector">\n) 
     755    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n) 
     756    expected << "</select>\n" 
     757 
     758    assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => "selector") 
     759  end 
     760 
    674761  def test_select_datetime 
    675762    expected =  %(<select id="date_first_year" name="date[first][year]">\n) 
     
    748835  end 
    749836 
     837  def test_select_datetime_with_html_options 
     838    expected =  %(<select id="date_first_year" name="date[first][year]" class="selector">\n) 
     839    expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n) 
     840    expected << "</select>\n" 
     841 
     842    expected << %(<select id="date_first_month" name="date[first][month]" class="selector">\n) 
     843    expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n) 
     844    expected << "</select>\n" 
     845 
     846    expected << %(<select id="date_first_day" name="date[first][day]" class="selector">\n) 
     847    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n) 
     848    expected << "</select>\n" 
     849 
     850    expected << %(<select id="date_first_hour" name="date[first][hour]" class="selector">\n) 
     851    expected << %(<option 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" selected="selected">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) 
     852    expected << "</select>\n" 
     853 
     854    expected << %(<select id="date_first_minute" name="date[first][minute]" class="selector">\n) 
     855    expected << %(<option 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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n) 
     856    expected << "</select>\n" 
     857 
     858    assert_dom_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => 'selector') 
     859  end 
     860 
    750861  def test_select_time 
    751862    expected = %(<select id="date_hour" name="date[hour]">\n) 
     
    810921 
    811922    assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :include_seconds => true, :time_separator => ' : ') 
     923  end 
     924 
     925  def test_select_time_with_html_options 
     926    expected = %(<select id="date_hour" name="date[hour]" class="selector">\n) 
     927    expected << %(<option 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" selected="selected">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) 
     928    expected << "</select>\n" 
     929 
     930    expected << %(<select id="date_minute" name="date[minute]" class="selector">\n) 
     931    expected << %(<option 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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n) 
     932    expected << "</select>\n" 
     933 
     934    assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector') 
     935    assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {:include_seconds => false}, :class => 'selector') 
    812936  end 
    813937 
     
    9881112  end 
    9891113 
     1114  def test_date_select_with_html_options 
     1115    @post = Post.new 
     1116    @post.written_on = Date.new(2004, 6, 15) 
     1117 
     1118    expected = %{<select id="post_written_on_1i" name="post[written_on(1i)]" class="selector">\n} 
     1119    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} 
     1120    expected << "</select>\n" 
     1121 
     1122    expected << %{<select id="post_written_on_2i" name="post[written_on(2i)]" class="selector">\n} 
     1123    expected << %{<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n} 
     1124    expected << "</select>\n" 
     1125 
     1126    expected << %{<select id="post_written_on_3i" name="post[written_on(3i)]" class="selector">\n} 
     1127    expected << %{<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n} 
     1128 
     1129    expected << "</select>\n" 
     1130 
     1131    assert_dom_equal expected, date_select("post", "written_on", {}, :class => 'selector') 
     1132  end 
     1133 
    9901134  def test_time_select 
    9911135    @post = Post.new 
     
    10281172 
    10291173    assert_dom_equal expected, time_select("post", "written_on", :include_seconds => true) 
     1174  end 
     1175 
     1176  def test_time_select_with_html_options 
     1177    @post = Post.new 
     1178    @post.written_on = Time.local(2004, 6, 15, 15, 16, 35) 
     1179 
     1180    expected = %{<input type="hidden" id="post_written_on_1i" name="post[written_on(1i)]" value="2004" />\n} 
     1181    expected << %{<input type="hidden" id="post_written_on_2i" name="post[written_on(2i)]" value="6" />\n} 
     1182    expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n} 
     1183 
     1184    expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]" class="selector">\n) 
     1185    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) } 
     1186    expected << "</select>\n" 
     1187    expected << " : " 
     1188    expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]" class="selector">\n) 
     1189    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) } 
     1190    expected << "</select>\n" 
     1191 
     1192    assert_dom_equal expected, time_select("post", "written_on", {}, :class => 'selector') 
    10301193  end 
    10311194 
     
    11571320 
    11581321    expected << %(<select id="date_first_day" name="date[first][day]">\n) 
    1159     expected << 
    1160 %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n) 
     1322    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n) 
    11611323    expected << "</select>\n" 
    11621324 
     
    11711333    assert_dom_equal expected, select_datetime(nil, :prefix => "date[first]") 
    11721334  end 
    1173  
    11741335 
    11751336  def test_datetime_select_with_options_index 
     
    14561617    assert_dom_equal expected, datetime_select("post", "updated_at", :default => { :month => 10, :minute => 42, :hour => 9 }) 
    14571618  end 
     1619 
     1620  def test_datetime_select_with_html_options 
     1621    @post = Post.new 
     1622    @post.updated_at = Time.local(2004, 6, 15, 16, 35) 
     1623 
     1624    expected = %{<select id="post_updated_at_1i" name="post[updated_at(1i)]" class="selector">\n} 
     1625    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} 
     1626    expected << "</select>\n" 
     1627 
     1628    expected << %{<select id="post_updated_at_2i" name="post[updated_at(2i)]" class="selector">\n} 
     1629    expected << %{<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n} 
     1630    expected << "</select>\n" 
     1631 
     1632    expected << %{<select id="post_updated_at_3i" name="post[updated_at(3i)]" class="selector">\n} 
     1633    expected << %{<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</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" selected="selected">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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n} 
     1634    expected << "</select>\n" 
     1635 
     1636    expected << " &mdash; " 
     1637 
     1638    expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]" class="selector">\n} 
     1639    expected << %{<option 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" selected="selected">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} 
     1640    expected << "</select>\n" 
     1641    expected << " : " 
     1642    expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]" class="selector">\n} 
     1643    expected << %{<option 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<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35" selected="selected">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n} 
     1644    expected << "</select>\n" 
     1645 
     1646    assert_dom_equal expected, datetime_select("post", "updated_at", {}, :class => 'selector') 
     1647  end 
     1648 
    14581649end