2010-02-06 16:21:26 -05:00
|
|
|
module SimpleForm
|
|
|
|
module Inputs
|
|
|
|
class NumericInput < Base
|
|
|
|
def input
|
|
|
|
@builder.text_field(attribute_name, input_html_options)
|
|
|
|
end
|
|
|
|
|
|
|
|
def input_html_options
|
|
|
|
input_options = super
|
2010-06-01 17:37:53 -04:00
|
|
|
input_options[:type] ||= "number"
|
2010-02-06 16:21:26 -05:00
|
|
|
input_options[:size] ||= SimpleForm.default_input_size
|
2010-09-05 11:19:45 -04:00
|
|
|
|
|
|
|
infer_attrs_from_validations(input_options)
|
|
|
|
|
2010-02-06 16:21:26 -05:00
|
|
|
input_options
|
|
|
|
end
|
2010-06-01 17:37:53 -04:00
|
|
|
|
|
|
|
def input_html_classes
|
|
|
|
super.unshift("numeric")
|
|
|
|
end
|
2010-09-05 11:19:45 -04:00
|
|
|
|
|
|
|
protected
|
|
|
|
|
|
|
|
def infer_attrs_from_validations(input_options)
|
2010-09-05 11:54:00 -04:00
|
|
|
model_class = @builder.object.class
|
2010-09-05 11:19:45 -04:00
|
|
|
|
2010-09-05 11:54:00 -04:00
|
|
|
# The model should include ActiveModel::Validations.
|
|
|
|
return unless model_class.respond_to?(:validators_on)
|
2010-09-05 11:19:45 -04:00
|
|
|
|
2010-09-05 11:54:00 -04:00
|
|
|
num_validator = find_numericality_validator(model_class) or return
|
2010-09-05 11:19:45 -04:00
|
|
|
|
|
|
|
options = num_validator.__send__(:options)
|
|
|
|
|
2010-09-05 11:32:13 -04:00
|
|
|
input_options[:min] ||= options[:greater_than_or_equal_to]
|
|
|
|
input_options[:max] ||= options[:less_than_or_equal_to]
|
|
|
|
input_options[:step] ||= options[:only_integer] && 1
|
2010-09-05 11:19:45 -04:00
|
|
|
end
|
2010-09-05 11:54:00 -04:00
|
|
|
|
|
|
|
def find_numericality_validator(model_class)
|
|
|
|
validators = model_class.validators_on(attribute_name)
|
|
|
|
validators.find {|v| ActiveModel::Validations::NumericalityValidator === v }
|
|
|
|
end
|
2010-02-06 16:21:26 -05:00
|
|
|
end
|
|
|
|
end
|
2010-09-05 11:19:45 -04:00
|
|
|
end
|