Module: Formtastic::Inputs::Base::Timeish
- Included in:
- DateSelectInput, DatetimeSelectInput, TimeSelectInput
- Defined in:
- lib/formtastic/inputs/base/timeish.rb
Overview
Document i18n
Check what other Rails options are supported (start_year
, end_year
, use_month_numbers
, use_short_month
, add_month_numbers
, prompt
), write tests for them, and otherwise support them
Could we take the rendering from Rails' helpers and inject better HTML in and around it rather than re-inventing the whee?
Timeish inputs (:date_select
, :datetime_select
, :time_select
) are similar to the Rails date and time
helpers (date_select
, datetime_select
, time_select
), rendering a series of <select>
tags for each fragment (year, month, day, hour, minute, seconds). The fragments are then
re-combined to a date by ActiveRecord through multi-parameter assignment.
The mark-up produced by Rails is simple but far from ideal, with no way to label the
individual fragments for accessibility, no fieldset to group the related fields, and no
legend describing the group. Formtastic addresses this within the standard <li>
wrapper
with a <fieldset>
with a <legend>
as a label, followed by an ordered list (<ol>
) of
list items (<li>
), one for each fragment (year, month, ...). Each <li>
fragment contains
a <label>
(eg "Year") for the fragment, and a <select>
containing <option>
s (eg a
range of years).
In the supplied formtastic.css file, the resulting mark-up is styled to appear a lot like a standard Rails date time select by:
- styling the legend to look like the other labels (to the left hand side of the selects)
- floating the
<li>
fragments against each other as a single line - hiding the
<label>
of each fragment withdisplay:none
Instance Method Summary collapse
- #date_fragments ⇒ Object
- #default_date_fragments ⇒ Object
- #fragment_id(fragment) ⇒ Object
- #fragment_input_html(fragment) ⇒ Object
- #fragment_label(fragment) ⇒ Object
- #fragment_label_html(fragment) ⇒ Object
- #fragment_name(fragment) ⇒ Object
- #fragment_prefix ⇒ Object
- #fragment_wrapping(&block) ⇒ Object
- #fragment_wrapping_html_options ⇒ Object
- #fragments ⇒ Object
- #fragments_inner_wrapping(&block) ⇒ Object
- #fragments_label ⇒ Object
- #fragments_wrapping(&block) ⇒ Object
- #fragments_wrapping_html_options ⇒ Object
- #hidden_field_name(fragment) ⇒ Object
- #hidden_fragments ⇒ Object
- #i18n_date_fragments ⇒ Object
-
#include_blank? ⇒ Boolean
TODO extract to BlankOptions or similar -- Select uses similar code.
- #position(fragment) ⇒ Object
- #positions ⇒ Object
- #time_fragments ⇒ Object
- #to_html ⇒ Object
- #value ⇒ Object
Instance Method Details
#date_fragments ⇒ Object
116 117 118 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 116 def date_fragments [:order] || i18n_date_fragments || default_date_fragments end |
#default_date_fragments ⇒ Object
120 121 122 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 120 def default_date_fragments [:year, :month, :day] end |
#fragment_id(fragment) ⇒ Object
141 142 143 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 141 def fragment_id(fragment) "#{[:id]}_#{position(fragment)}i" end |
#fragment_input_html(fragment) ⇒ Object
158 159 160 161 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 158 def fragment_input_html(fragment) opts = .merge(:prefix => fragment_prefix, :field_name => fragment_name(fragment), :default => value, :include_blank => include_blank?) template.send(:"select_#{fragment}", value, opts, .merge(:id => fragment_id(fragment))) end |
#fragment_label(fragment) ⇒ Object
132 133 134 135 136 137 138 139 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 132 def fragment_label(fragment) = [:labels] || {} if .key?(fragment) [fragment] else ::I18n.t(fragment.to_s, :default => fragment.to_s.humanize, :scope => [:datetime, :prompts]) end end |
#fragment_label_html(fragment) ⇒ Object
149 150 151 152 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 149 def fragment_label_html(fragment) text = fragment_label(fragment) text.blank? ? "".html_safe : template.content_tag(:label, text, :for => fragment_id(fragment)) end |
#fragment_name(fragment) ⇒ Object
145 146 147 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 145 def fragment_name(fragment) "#{method}(#{position(fragment)}i)" end |
#fragment_prefix ⇒ Object
163 164 165 166 167 168 169 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 163 def fragment_prefix if builder..key?(:index) object_name + "[#{builder.[:index]}]" else object_name end end |
#fragment_wrapping(&block) ⇒ Object
124 125 126 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 124 def fragment_wrapping(&block) template.content_tag(:li, template.capture(&block), ) end |
#fragment_wrapping_html_options ⇒ Object
128 129 130 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 128 def { :class => 'fragment' } end |
#fragments ⇒ Object
108 109 110 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 108 def fragments date_fragments + time_fragments end |
#fragments_inner_wrapping(&block) ⇒ Object
212 213 214 215 216 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 212 def fragments_inner_wrapping(&block) template.content_tag(:ol, template.capture(&block) ) end |
#fragments_label ⇒ Object
201 202 203 204 205 206 207 208 209 210 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 201 def fragments_label if render_label? template.content_tag(:legend, builder.label(method, label_text, :for => fragment_id(fragments.first)), :class => "label" ) else "".html_safe end end |
#fragments_wrapping(&block) ⇒ Object
190 191 192 193 194 195 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 190 def fragments_wrapping(&block) template.content_tag(:fieldset, template.capture(&block).html_safe, ) end |
#fragments_wrapping_html_options ⇒ Object
197 198 199 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 197 def { :class => "fragments" } end |
#hidden_field_name(fragment) ⇒ Object
222 223 224 225 226 227 228 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 222 def hidden_field_name(fragment) if builder..key?(:index) "#{object_name}[#{builder.[:index]}][#{fragment_name(fragment)}]" else "#{object_name}[#{fragment_name(fragment)}]" end end |
#hidden_fragments ⇒ Object
218 219 220 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 218 def hidden_fragments "".html_safe end |
#i18n_date_fragments ⇒ Object
184 185 186 187 188 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 184 def i18n_date_fragments order = ::I18n.t(:order, :scope => [:date]) order = nil unless order.is_a?(Array) order end |
#include_blank? ⇒ Boolean
TODO extract to BlankOptions or similar -- Select uses similar code
172 173 174 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 172 def include_blank? .key?(:include_blank) ? [:include_blank] : builder.include_blank_for_select_by_default end |
#position(fragment) ⇒ Object
180 181 182 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 180 def position(fragment) positions[fragment] end |
#positions ⇒ Object
176 177 178 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 176 def positions { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 } end |
#time_fragments ⇒ Object
112 113 114 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 112 def time_fragments [:include_seconds] ? [:hour, :minute, :second] : [:hour, :minute] end |
#to_html ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 90 def to_html input_wrapping do fragments_wrapping do hidden_fragments << fragments_label << template.content_tag(:ol, fragments.map do |fragment| fragment_wrapping do fragment_label_html(fragment) << fragment_input_html(fragment) end end.join.html_safe, # TODO is this safe? { :class => 'fragments-group' } # TODO refactor to fragments_group_wrapping ) end end end |
#value ⇒ Object
154 155 156 |
# File 'lib/formtastic/inputs/base/timeish.rb', line 154 def value object.send(method) if object && object.respond_to?(method) end |