module BootstrapFormExtensions::Duration

Public Instance Methods

duration(method, **options) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 18
def duration method, **options
  options[:class] = merge_css_classes options[:class], 'form-control'
  fields = duration_fields_builder method, options.except(:wrapper, :wrapper_class)

  # TODO: Replace for these commented out lines, once this pull request is merged: https://github.com/bootstrap-ruby/rails-bootstrap-forms/pull/238
  # options[:wrapper] ||= {}
  # options[:wrapper].merge! inline: true
  options[:control_col] = control_col_for_number_fields options

  options[:wrapper_class] = merge_css_classes options[:wrapper_class], 'duration-group'
  options[:wrapper] ||= {}
  options[:wrapper][:data] ||= {}
  options[:wrapper][:data][:duration] = true

  form_group_builder(method, options) { fields }
end
duration_without_bootstrap(method, **options) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 7
def duration_without_bootstrap method, **options
  fields = duration_fields_builder method, options.except(:wrapper, :wrapper_class)

  options[:class] = merge_css_classes options.delete(:wrapper_class), 'duration-group'
  options.merge!(options.delete(:wrapper) { {} })
  options[:data] ||= {}
  options[:data][:duration] = true

  content_tag :div, fields, options
end

Private Instance Methods

control_col_for_number_fields(options) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 63
def control_col_for_number_fields options
  (options[:control_col] || control_col.clone) + ' form-inline'
end
duration_fields_builder(method, options) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 37
def duration_fields_builder method, options
  hours, minutes, seconds, milliseconds = parse_duration_values method
  hidden = hidden_field method, class: 'duration-seconds', data: { formatted: ('%5d:%02d:%02d.%03d' % [ hours, minutes, seconds, milliseconds ]).strip }
  number_fields = %w[ hours minutes seconds milliseconds ].inject(''.html_safe) do |html, unit|
    html << unit_field_builder(unit, eval(unit), options.dup)
  end
  hidden + number_fields
end
parse_duration_values(method) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 46
def parse_duration_values method
  duration_seconds = object.send(method).to_f
  hours, minutes, seconds, milliseconds = [ 1, 60, 60 ].reduce([ duration_seconds ]) do |values, unit|
    values.unshift(values.shift.divmod(unit)).flatten
  end
  [ hours, minutes, seconds, (milliseconds * 1000).round ]
end
unit_field_builder(unit, value, options) click to toggle source
# File lib/bootstrap_form_extensions/duration.rb, line 54
def unit_field_builder unit, value, options
  options[:class] = merge_css_classes options[:class], unit
  options.merge! min: 0, pattern: '[0-9]*'
  options.merge! max: (unit == 'milliseconds' ? 999 : 59) unless unit == 'hours'
  field = @template.number_field_tag "#{object_name}[#{unit}]", value, options
  separator = unit == 'milliseconds' ? '' : unit == 'seconds' ? '.' : ':'
  field + separator
end