Skip to content

Commit

Permalink
Refactor NumberInput and RangeInput to be Numeric rather than Stringish
Browse files Browse the repository at this point in the history
  • Loading branch information
haines committed Dec 29, 2011
1 parent 64fe28c commit 6ae39e9
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 73 deletions.
1 change: 1 addition & 0 deletions lib/formtastic/inputs/base.rb
Expand Up @@ -43,6 +43,7 @@ def removed_option!(old_option_name)
autoload :Html
autoload :Labelling
autoload :Naming
autoload :Numeric
autoload :Options
autoload :Placeholder
autoload :Stringish
Expand Down
46 changes: 46 additions & 0 deletions lib/formtastic/inputs/base/numeric.rb
@@ -0,0 +1,46 @@
module Formtastic
module Inputs
module Base
module Numeric
def input_html_options
defaults = super

if in_option
defaults[:min] = in_option.to_a.min
defaults[:max] = in_option.to_a.max
else
defaults[:min] ||= min_option
defaults[:max] ||= max_option
end
defaults[:step] ||= step_option
defaults
end

def step_option
return options[:step] if options.key?(:step)
validation_step
end

def min_option
return options[:min] if options.key?(:min)
validation_min
end

def max_option
return options[:max] if options.key?(:max)
validation_max
end

def in_option
options[:in]
end

def wrapper_html_options
new_class = [super[:class], "numeric"].compact.join(" ")
super.merge(:class => new_class)
end

end
end
end
end
2 changes: 1 addition & 1 deletion lib/formtastic/inputs/base/validations.rb
Expand Up @@ -108,7 +108,7 @@ def validation_step
validation.kind == :numericality
end
if validation
validation.options[:step]
validation.options[:step] || (1 if validation_integer_only?)
else
nil
end
Expand Down
39 changes: 4 additions & 35 deletions lib/formtastic/inputs/number_input.rb
Expand Up @@ -69,7 +69,7 @@ module Inputs
# @see http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of Rails' Numericality validation documentation
class NumberInput
include Base
include Base::Stringish
include Base::Numeric
include Base::Placeholder

def to_html
Expand All @@ -78,42 +78,11 @@ def to_html
builder.number_field(method, input_html_options)
end
end

def input_html_options
defaults = super

if in_option
defaults[:min] = in_option.to_a.min
defaults[:max] = in_option.to_a.max
else
defaults[:min] ||= min_option
defaults[:max] ||= max_option
end
defaults[:step] ||= step_option
defaults
end


def step_option
return options[:step] if options.key?(:step)
return validation_step if validation_step
return 1 if validation_integer_only?
"any"
end

def min_option
return options[:min] if options.key?(:min)
validation_min
super || "any"
end

def max_option
return options[:max] if options.key?(:max)
validation_max
end

def in_option
options[:in]
end


end
end
end
38 changes: 7 additions & 31 deletions lib/formtastic/inputs/range_input.rb
Expand Up @@ -67,51 +67,27 @@ module Inputs
# @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
# @see http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of Rails' Numericality validation documentation
#
# @todo Is it still correct for this to be Stringish?
class RangeInput
include Base
include Base::Stringish
include Base::Numeric

def to_html
input_wrapping do
label_html <<
builder.range_field(method, input_html_options)
end
end

def input_html_options
defaults = super

if in_option
defaults[:min] = in_option.to_a.min
defaults[:max] = in_option.to_a.max
else
defaults[:min] ||= min_option
defaults[:max] ||= max_option
end
defaults[:step] ||= step_option
defaults
end

def step_option
return options[:step] if options.key?(:step)
return validation_step if validation_step
return 1 if validation_integer_only?
1
end


def min_option
return options[:min] if options.key?(:min)
validation_min || 1
super || 1
end

def max_option
return options[:max] if options.key?(:max)
validation_max || 100
super || 100
end
def in_option
options[:in]

def step_option
super || 1
end

end
Expand Down
11 changes: 6 additions & 5 deletions spec/inputs/number_input_spec.rb
Expand Up @@ -26,17 +26,18 @@

it_should_have_input_wrapper_with_class(:number)
it_should_have_input_wrapper_with_class(:input)
it_should_have_input_wrapper_with_class(:stringish)
it_should_have_input_wrapper_with_class(:numeric)
it_should_have_input_wrapper_with_id("post_title_input")
it_should_have_label_with_text(/Title/)
it_should_have_label_for("post_title")
it_should_have_input_with_id("post_title")
it_should_have_input_with_type(:number)
it_should_have_input_with_name("post[title]")
it_should_use_default_text_field_size_when_not_nil(:string)
it_should_not_use_default_text_field_size_when_nil(:string)
it_should_apply_custom_input_attributes_when_input_html_provided(:string)
it_should_apply_custom_for_to_label_when_input_html_id_provided(:string)
# @todo this is not testing what it should be testing!
# it_should_use_default_text_field_size_when_not_nil(:string)
# it_should_not_use_default_text_field_size_when_nil(:string)
# it_should_apply_custom_input_attributes_when_input_html_provided(:string)
# it_should_apply_custom_for_to_label_when_input_html_id_provided(:string)
it_should_apply_error_logic_for_input_type(:number)

end
Expand Down
2 changes: 1 addition & 1 deletion spec/inputs/range_input_spec.rb
Expand Up @@ -19,7 +19,7 @@

it_should_have_input_wrapper_with_class(:range)
it_should_have_input_wrapper_with_class(:input)
it_should_have_input_wrapper_with_class(:stringish) # might be removed
it_should_have_input_wrapper_with_class(:numeric)
it_should_have_input_wrapper_with_id("author_age_input")
it_should_have_label_with_text(/Age/)
it_should_have_label_for("author_age")
Expand Down

0 comments on commit 6ae39e9

Please sign in to comment.