Class: ActionView::Helpers::DateTimeSelector

Inherits:
Object
  • Object
show all
Includes:
TagHelper
Defined in:
actionpack/lib/action_view/helpers/date_helper.rb

Overview

:nodoc:

Constant Summary collapse

DEFAULT_PREFIX =
'date'.freeze
POSITION =
{
  :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6
}.freeze
AMPM_TRANSLATION =
Hash[
  [[0, "12 AM"], [1, "01 AM"], [2, "02 AM"], [3, "03 AM"],
   [4, "04 AM"], [5, "05 AM"], [6, "06 AM"], [7, "07 AM"],
   [8, "08 AM"], [9, "09 AM"], [10, "10 AM"], [11, "11 AM"],
   [12, "12 PM"], [13, "01 PM"], [14, "02 PM"], [15, "03 PM"],
   [16, "04 PM"], [17, "05 PM"], [18, "06 PM"], [19, "07 PM"],
   [20, "08 PM"], [21, "09 PM"], [22, "10 PM"], [23, "11 PM"]]
].freeze

Constants included from TagHelper

TagHelper::BOOLEAN_ATTRIBUTES, TagHelper::PRE_CONTENT_STRINGS

Instance Method Summary collapse

Methods included from TagHelper

#cdata_section, #content_tag, #escape_once, #tag

Methods included from ActiveSupport::Concern

#append_features, extended, #included

Methods included from CaptureHelper

#capture, #content_for, #content_for?, #flush_output_buffer, #provide, #with_output_buffer

Constructor Details

#initialize(datetime, options = {}, html_options = {}) ⇒ DateTimeSelector

Returns a new instance of DateTimeSelector.



640
641
642
643
644
645
646
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 640

def initialize(datetime, options = {}, html_options = {})
  @options      = options.dup
  @html_options = html_options.dup
  @datetime     = datetime
  @options[:datetime_separator] ||= ' — '
  @options[:time_separator]     ||= ' : '
end

Instance Method Details

#select_dateObject



673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 673

def select_date
  order = date_order.dup

  @options[:discard_hour]     = true
  @options[:discard_minute]   = true
  @options[:discard_second]   = true

  @options[:discard_year]   ||= true unless order.include?(:year)
  @options[:discard_month]  ||= true unless order.include?(:month)
  @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
  # valid (otherwise it could be 31 and February wouldn't be a valid date)
  if @datetime && @options[:discard_day] && !@options[:discard_month]
    @datetime = @datetime.change(:day => 1)
  end

  [:day, :month, :year].each { |o| order.unshift(o) unless order.include?(o) }

  build_selects_from_types(order)
end

#select_datetimeObject



648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 648

def select_datetime
  order = date_order.dup
  order -= [:hour, :minute, :second]
  @options[:discard_year]   ||= true unless order.include?(:year)
  @options[:discard_month]  ||= true unless order.include?(:month)
  @options[:discard_day]    ||= true if @options[:discard_month] || !order.include?(:day)
  @options[:discard_minute] ||= true if @options[:discard_hour]
  @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
  # valid (otherwise it could be 31 and February wouldn't be a valid date)
  if @datetime && @options[:discard_day] && !@options[:discard_month]
    @datetime = @datetime.change(:day => 1)
  end

  if @options[:tag] && @options[:ignore_date]
    select_time
  else
    [:day, :month, :year].each { |o| order.unshift(o) unless order.include?(o) }
    order += [:hour, :minute, :second] unless @options[:discard_hour]

    build_selects_from_types(order)
  end
end

#select_dayObject



735
736
737
738
739
740
741
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 735

def select_day
  if @options[:use_hidden] || @options[:discard_day]
    build_hidden(:day, day || 1)
  else
    build_options_and_select(:day, day, :start => 1, :end => 31, :leading_zeros => false, :use_two_digit_numbers => @options[:use_two_digit_numbers])
  end
end

#select_hourObject



727
728
729
730
731
732
733
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 727

def select_hour
  if @options[:use_hidden] || @options[:discard_hour]
    build_hidden(:hour, hour)
  else
    build_options_and_select(:hour, hour, :end => 23, :ampm => @options[:ampm])
  end
end

#select_minuteObject



719
720
721
722
723
724
725
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 719

def select_minute
  if @options[:use_hidden] || @options[:discard_minute]
    build_hidden(:minute, min)
  else
    build_options_and_select(:minute, min, :step => @options[:minute_step])
  end
end

#select_monthObject



743
744
745
746
747
748
749
750
751
752
753
754
755
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 743

def select_month
  if @options[:use_hidden] || @options[:discard_month]
    build_hidden(:month, month || 1)
  else
    month_options = []
    1.upto(12) do |month_number|
      options = { :value => month_number }
      options[:selected] = "selected" if month == month_number
      month_options << (:option, month_name(month_number), options) + "\n"
    end
    build_select(:month, month_options.join)
  end
end

#select_secondObject



711
712
713
714
715
716
717
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 711

def select_second
  if @options[:use_hidden] || @options[:discard_second]
    build_hidden(:second, sec) if @options[:include_seconds]
  else
    build_options_and_select(:second, sec)
  end
end

#select_timeObject



695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 695

def select_time
  order = []

  @options[:discard_month]    = true
  @options[:discard_year]     = true
  @options[:discard_day]      = true
  @options[:discard_second] ||= true unless @options[:include_seconds]

  order += [:year, :month, :day] unless @options[:ignore_date]

  order += [:hour, :minute]
  order << :second if @options[:include_seconds]

  build_selects_from_types(order)
end

#select_yearObject



757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
# File 'actionpack/lib/action_view/helpers/date_helper.rb', line 757

def select_year
  if !@datetime || @datetime == 0
    val = '1'
    middle_year = Date.today.year
  else
    val = middle_year = year
  end

  if @options[:use_hidden] || @options[:discard_year]
    build_hidden(:year, val)
  else
    options                     = {}
    options[:start]             = @options[:start_year] || middle_year - 5
    options[:end]               = @options[:end_year] || middle_year + 5
    options[:step]              = options[:start] < options[:end] ? 1 : -1
    options[:leading_zeros]     = false
    options[:max_years_allowed] = @options[:max_years_allowed] || 1000

    if (options[:end] - options[:start]).abs > options[:max_years_allowed]
      raise ArgumentError,  "There're too many years options to be built. Are you sure you haven't mistyped something? You can provide the :max_years_allowed parameter"
    end

    build_options_and_select(:year, val, options)
  end
end