2010-02-06 16:21:26 -05:00
|
|
|
module SimpleForm
|
|
|
|
module Inputs
|
|
|
|
class NumericInput < Base
|
|
|
|
def input
|
Add configuration option to explicitly turn off HTML5 extensions.
This includes the new field types such as email, number, search, url,
tel, and the new attributes such as required, autofocus, maxlength, min, max, step.
None of these are technically allowed in the HTML4 or XHTML1.0 doc types.
Test coverage and updated README.
Update config file generator with new HTML5 option.
2011-04-01 19:31:48 -04:00
|
|
|
input_html_options[:type] ||= "number" if SimpleForm.use_html5
|
2010-11-07 04:41:33 -05:00
|
|
|
input_html_options[:size] ||= SimpleForm.default_input_size
|
Add configuration option to explicitly turn off HTML5 extensions.
This includes the new field types such as email, number, search, url,
tel, and the new attributes such as required, autofocus, maxlength, min, max, step.
None of these are technically allowed in the HTML4 or XHTML1.0 doc types.
Test coverage and updated README.
Update config file generator with new HTML5 option.
2011-04-01 19:31:48 -04:00
|
|
|
input_html_options[:step] ||= integer? ? 1 : "any" if SimpleForm.use_html5
|
|
|
|
infer_attributes_from_validations! if SimpleForm.use_html5
|
2010-02-06 16:21:26 -05:00
|
|
|
@builder.text_field(attribute_name, input_html_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
|
|
|
|
|
2010-11-07 04:41:33 -05:00
|
|
|
def has_placeholder?
|
Add configuration option to explicitly turn off HTML5 extensions.
This includes the new field types such as email, number, search, url,
tel, and the new attributes such as required, autofocus, maxlength, min, max, step.
None of these are technically allowed in the HTML4 or XHTML1.0 doc types.
Test coverage and updated README.
Update config file generator with new HTML5 option.
2011-04-01 19:31:48 -04:00
|
|
|
SimpleForm.use_html5 && placeholder_present?
|
2010-11-07 04:41:33 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def infer_attributes_from_validations!
|
2010-09-13 23:40:03 -04:00
|
|
|
return unless has_validators?
|
2010-09-05 11:19:45 -04:00
|
|
|
|
2010-09-13 23:40:03 -04:00
|
|
|
numeric_validator = find_numericality_validator or return
|
|
|
|
validator_options = numeric_validator.options
|
2010-09-05 11:19:45 -04:00
|
|
|
|
2010-11-07 04:41:33 -05:00
|
|
|
input_html_options[:min] ||= minimum_value(validator_options)
|
|
|
|
input_html_options[:max] ||= maximum_value(validator_options)
|
2010-09-05 12:47:54 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def integer?
|
|
|
|
input_type == :integer
|
2010-09-05 11:19:45 -04:00
|
|
|
end
|
2010-09-05 11:54:00 -04:00
|
|
|
|
2010-09-13 23:40:03 -04:00
|
|
|
def minimum_value(validator_options)
|
|
|
|
if integer? && validator_options.key?(:greater_than)
|
2011-03-10 22:11:54 -05:00
|
|
|
evaluate_validator_option(validator_options[:greater_than]) + 1
|
2010-09-13 23:40:03 -04:00
|
|
|
else
|
2011-03-11 23:12:01 -05:00
|
|
|
evaluate_validator_option(validator_options[:greater_than_or_equal_to])
|
2010-09-13 23:40:03 -04:00
|
|
|
end
|
2010-09-05 12:46:02 -04:00
|
|
|
end
|
|
|
|
|
2010-09-13 23:40:03 -04:00
|
|
|
def maximum_value(validator_options)
|
|
|
|
if integer? && validator_options.key?(:less_than)
|
2011-03-10 22:11:54 -05:00
|
|
|
evaluate_validator_option(validator_options[:less_than]) - 1
|
2010-09-13 23:40:03 -04:00
|
|
|
else
|
2011-03-11 23:12:01 -05:00
|
|
|
evaluate_validator_option(validator_options[:less_than_or_equal_to])
|
2010-09-13 23:40:03 -04:00
|
|
|
end
|
2010-09-05 12:46:02 -04:00
|
|
|
end
|
|
|
|
|
2010-09-13 23:40:03 -04:00
|
|
|
def find_numericality_validator
|
|
|
|
attribute_validators.find { |v| ActiveModel::Validations::NumericalityValidator === v }
|
2010-09-05 11:54:00 -04:00
|
|
|
end
|
2011-03-10 21:54:59 -05:00
|
|
|
|
|
|
|
private
|
|
|
|
|
2011-03-10 22:11:54 -05:00
|
|
|
def evaluate_validator_option(option)
|
2011-03-10 21:54:59 -05:00
|
|
|
return option if option.is_a?(Numeric)
|
|
|
|
return object.send(option) if option.is_a?(Symbol)
|
|
|
|
return option.call(object) if option.respond_to?(:call)
|
|
|
|
end
|
2010-02-06 16:21:26 -05:00
|
|
|
end
|
|
|
|
end
|
2010-09-05 11:19:45 -04:00
|
|
|
end
|