Skip to content

Instantly share code, notes, and snippets.

@clemens
Created July 22, 2008 20:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clemens/1276 to your computer and use it in GitHub Desktop.
Save clemens/1276 to your computer and use it in GitHub Desktop.
class DateTimeSelector
include TagHelper
POSITIONS = { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 }
def initialize(date, options={})
@date = date
@options = options
@object = @options.delete(:object)
@object_name = @options.delete(:object_name)
@method = @options.delete(:method)
end
def select_year
if options[:use_hidden]
_date_hidden_html(options[:field_name] || 'year', val, options)
else
options[:start_year] ||= middle_year - 5
options[:end_year] ||= middle_year + 5
step = options[:start_year] < options[:end_year] ? 1 : -1
build_select(:year,
build_options(:start => (@date - 5.years).year, :end => (@date + 5.years).year,
:leading_zeros => false, :selected => @date.year)
)
end
end
def select_month
end
def select_day
end
def select_hour
end
def select_minute
end
def select_second
end
def select_date
end
def select_time
end
def select_datetime
end
private
def build_options(options={})
options.reverse_merge!(:start => 0, :end => 59, :step => 1, :leading_zeros => true)
select_options = []
(options[:start] || 0).step((options[:end] || 59), options[:step] || 1) do |i|
value = options[:leading_zeros] ? sprintf("%02d", i) : i
tag_options = { :value => value }
tag_options[:selected] = "selected" if options[:selected] == i
select_options << content_tag(:option, value, tag_options)
end
select_options.join("\n") + "\n"
end
def build_select(type, options_as_html)
options = generate_name_and_id(type)
select_html = { :id => options[:id], :name => options[:name] }
select_html.merge!(:disabled => 'disabled') if options[:disabled]
select_html.merge!(@options[:html]) unless @options[:html].empty?
select_options = "\n"
select_options << content_tag(:option, '', :value => '') + "\n" if @options[:include_blank]
select_options << options_as_html.to_s
content_tag(:select, select_options, select_html) + "\n"
end
def generate_name_and_id(type)
options = {}
name = @object_name.nil? ? (@options[:prefix] || DateHelper::DEFAULT_PREFIX) : @object_name
type = @method.nil? ? type : @method
suffix = @object.nil? ? '' : "(#{POSITIONS[type]}i)"
options[:name] = name + (@options[:discard_type] ? '' : "[#{type}#{suffix}]")
options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '')
options
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment