From 433f5a76039cf0cbae9b41227a063922e06e3d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 6 Feb 2010 22:21:26 +0100 Subject: [PATCH] Add support for both email and url input types from HTML 5. --- CHANGELOG.rdoc | 8 +++++++ lib/simple_form/form_builder.rb | 5 +++- lib/simple_form/inputs.rb | 3 ++- lib/simple_form/inputs/numeric_input.rb | 16 +++++++++++++ lib/simple_form/inputs/string_input.rb | 24 +++++++++++++++++++ lib/simple_form/inputs/text_field_input.rb | 27 ---------------------- test/form_builder_test.rb | 14 +++++++++-- 7 files changed, 66 insertions(+), 31 deletions(-) create mode 100644 lib/simple_form/inputs/numeric_input.rb create mode 100644 lib/simple_form/inputs/string_input.rb delete mode 100644 lib/simple_form/inputs/text_field_input.rb diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index e69de29b..eae04e94 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -0,0 +1,8 @@ +== 1.1 + +* enhancements + * Rails 3 support with generators, templates and HTML 5 + +== 1.0 + +* First release \ No newline at end of file diff --git a/lib/simple_form/form_builder.rb b/lib/simple_form/form_builder.rb index f3fbedb0..890824a9 100644 --- a/lib/simple_form/form_builder.rb +++ b/lib/simple_form/form_builder.rb @@ -7,7 +7,8 @@ module SimpleForm include SimpleForm::Inputs map_type :boolean, :password, :text, :file, :to => SimpleForm::Inputs::MappingInput - map_type :string, :integer, :decimal, :float, :to => SimpleForm::Inputs::TextFieldInput + map_type :string, :email, :url, :to => SimpleForm::Inputs::StringInput + map_type :integer, :decimal, :float, :to => SimpleForm::Inputs::NumericInput map_type :select, :radio, :check_boxes, :to => SimpleForm::Inputs::CollectionInput map_type :date, :time, :datetime, :to => SimpleForm::Inputs::DateTimeInput map_type :country, :time_zone, :to => SimpleForm::Inputs::PriorityInput @@ -270,6 +271,8 @@ module SimpleForm when /password/ then :password when /time_zone/ then :time_zone when /country/ then :country + when /email/ then :email + when /url/ then :url end match || input_type || file_method? || :string diff --git a/lib/simple_form/inputs.rb b/lib/simple_form/inputs.rb index 1f422f54..a8816db2 100644 --- a/lib/simple_form/inputs.rb +++ b/lib/simple_form/inputs.rb @@ -6,7 +6,8 @@ module SimpleForm autoload :DateTimeInput, 'simple_form/inputs/date_time_input' autoload :HiddenInput, 'simple_form/inputs/hidden_input' autoload :MappingInput, 'simple_form/inputs/mapping_input' + autoload :NumericInput, 'simple_form/inputs/numeric_input' autoload :PriorityInput, 'simple_form/inputs/priority_input' - autoload :TextFieldInput, 'simple_form/inputs/text_field_input' + autoload :StringInput, 'simple_form/inputs/string_input' end end \ No newline at end of file diff --git a/lib/simple_form/inputs/numeric_input.rb b/lib/simple_form/inputs/numeric_input.rb new file mode 100644 index 00000000..1d4222ed --- /dev/null +++ b/lib/simple_form/inputs/numeric_input.rb @@ -0,0 +1,16 @@ +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 + input_options[:class] = "numeric #{input_options[:class]}" + input_options[:size] ||= SimpleForm.default_input_size + input_options + end + end + end +end \ No newline at end of file diff --git a/lib/simple_form/inputs/string_input.rb b/lib/simple_form/inputs/string_input.rb new file mode 100644 index 00000000..fe1474f4 --- /dev/null +++ b/lib/simple_form/inputs/string_input.rb @@ -0,0 +1,24 @@ +module SimpleForm + module Inputs + class StringInput < Base + def input + @builder.text_field(attribute_name, input_html_options) + end + + def input_html_options + input_options = super + input_options[:class] = "string #{input_options[:class]}" unless input_type == :string + input_options[:size] ||= [limit, SimpleForm.default_input_size].compact.min + input_options[:maxlength] ||= limit if limit + input_options[:type] ||= input_type + input_options + end + + protected + + def limit + column && column.limit + end + end + end +end \ No newline at end of file diff --git a/lib/simple_form/inputs/text_field_input.rb b/lib/simple_form/inputs/text_field_input.rb deleted file mode 100644 index 53a596b1..00000000 --- a/lib/simple_form/inputs/text_field_input.rb +++ /dev/null @@ -1,27 +0,0 @@ -module SimpleForm - module Inputs - # Handles common text field inputs, as String, Numeric, Float and Decimal. - class TextFieldInput < Base - def input - @builder.text_field(attribute_name, input_html_options) - end - - def input_html_options - input_options = super - if text_type? && column && column.limit - input_options[:size] ||= [column.limit, SimpleForm.default_input_size].min - input_options[:maxlength] ||= column.limit - else - input_options[:size] ||= SimpleForm.default_input_size - end - input_options - end - - protected - - def text_type? - [:string, :email, :url].include?(input_type) - end - end - end -end \ No newline at end of file diff --git a/test/form_builder_test.rb b/test/form_builder_test.rb index 4f79bd34..c7e74dc6 100644 --- a/test/form_builder_test.rb +++ b/test/form_builder_test.rb @@ -79,12 +79,12 @@ class FormBuilderTest < ActionView::TestCase test 'builder should use integer text field for integer columns' do with_form_for @user, :age - assert_select 'form input#user_age.integer' + assert_select 'form input#user_age.numeric.integer' end test 'builder should generate decimal text field for decimal columns' do with_form_for @user, :credit_limit - assert_select 'form input#user_credit_limit.decimal' + assert_select 'form input#user_credit_limit.numeric.decimal' end test 'builder should generate password fields for columns that matches password' do @@ -102,6 +102,16 @@ class FormBuilderTest < ActionView::TestCase assert_select 'form select#user_time_zone.time_zone' end + test 'builder should generate email fields for columns that matches email' do + with_form_for @user, :email + assert_select 'form input#user_email.string.email' + end + + test 'builder should generate url fields for columns that matches url' do + with_form_for @user, :url + assert_select 'form input#user_url.string.url' + end + test 'builder should generate date select for date columns' do with_form_for @user, :born_at assert_select 'form select#user_born_at_1i.date'