diff --git a/lib/rails_admin/config/fields/types/decimal.rb b/lib/rails_admin/config/fields/types/decimal.rb index 9be21c9c2f..bb3e673d9c 100644 --- a/lib/rails_admin/config/fields/types/decimal.rb +++ b/lib/rails_admin/config/fields/types/decimal.rb @@ -1,12 +1,19 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/numeric' module RailsAdmin module Config module Fields module Types - class Decimal < RailsAdmin::Config::Fields::Base + class Decimal < RailsAdmin::Config::Fields::Types::Numeric # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) + + register_instance_option :html_attributes do + { + required: required?, + step: "any", + } + end end end end diff --git a/lib/rails_admin/config/fields/types/float.rb b/lib/rails_admin/config/fields/types/float.rb index 6a0937e249..bc6f0ab14e 100644 --- a/lib/rails_admin/config/fields/types/float.rb +++ b/lib/rails_admin/config/fields/types/float.rb @@ -1,12 +1,19 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/numeric' module RailsAdmin module Config module Fields module Types - class Float < RailsAdmin::Config::Fields::Base + class Float < RailsAdmin::Config::Fields::Types::Numeric # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) + + register_instance_option :html_attributes do + { + required: required?, + step: "any", + } + end end end end diff --git a/lib/rails_admin/config/fields/types/integer.rb b/lib/rails_admin/config/fields/types/integer.rb index 08e180b025..c3a9defa54 100644 --- a/lib/rails_admin/config/fields/types/integer.rb +++ b/lib/rails_admin/config/fields/types/integer.rb @@ -1,17 +1,13 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/numeric' module RailsAdmin module Config module Fields module Types - class Integer < RailsAdmin::Config::Fields::Base + class Integer < RailsAdmin::Config::Fields::Types::Numeric # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) - register_instance_option :view_helper do - :number_field - end - register_instance_option :sort_reverse? do serial? end diff --git a/lib/rails_admin/config/fields/types/numeric.rb b/lib/rails_admin/config/fields/types/numeric.rb new file mode 100644 index 0000000000..89c3509c99 --- /dev/null +++ b/lib/rails_admin/config/fields/types/numeric.rb @@ -0,0 +1,18 @@ +require 'rails_admin/config/fields/base' + +module RailsAdmin + module Config + module Fields + module Types + class Numeric < RailsAdmin::Config::Fields::Base + # Register field type for the type loader + RailsAdmin::Config::Fields::Types.register(self) + + register_instance_option :view_helper do + :number_field + end + end + end + end + end +end diff --git a/spec/rails_admin/config/fields/types/decimal_spec.rb b/spec/rails_admin/config/fields/types/decimal_spec.rb index 308c4ff2d8..df18629175 100644 --- a/spec/rails_admin/config/fields/types/decimal_spec.rb +++ b/spec/rails_admin/config/fields/types/decimal_spec.rb @@ -1,5 +1,5 @@ require 'spec_helper' RSpec.describe RailsAdmin::Config::Fields::Types::Decimal do - it_behaves_like 'a generic field type', :decimal_field, :decimal + it_behaves_like 'a float-like field type', :float_field end diff --git a/spec/rails_admin/config/fields/types/float_spec.rb b/spec/rails_admin/config/fields/types/float_spec.rb index 83ada22706..e7d730d4ec 100644 --- a/spec/rails_admin/config/fields/types/float_spec.rb +++ b/spec/rails_admin/config/fields/types/float_spec.rb @@ -1,5 +1,5 @@ require 'spec_helper' RSpec.describe RailsAdmin::Config::Fields::Types::Float do - it_behaves_like 'a generic field type', :float_field, :float + it_behaves_like 'a float-like field type', :float_field end diff --git a/spec/rails_admin/config/fields/types/numeric_spec.rb b/spec/rails_admin/config/fields/types/numeric_spec.rb new file mode 100644 index 0000000000..0fe813bee5 --- /dev/null +++ b/spec/rails_admin/config/fields/types/numeric_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +RSpec.describe RailsAdmin::Config::Fields::Types::Numeric do + it_behaves_like 'a generic field type', :integer_field, :integer + + subject do + RailsAdmin.config('FieldTest').fields.detect do |f| + f.name == :integer_field + end.with(object: FieldTest.new) + end + + describe '#view_helper' do + it "uses the 'number' type input tag" do + expect(subject.view_helper).to eq(:number_field) + end + end +end diff --git a/spec/shared_examples/shared_examples_for_field_types.rb b/spec/shared_examples/shared_examples_for_field_types.rb index 2dec54b547..94a651b880 100644 --- a/spec/shared_examples/shared_examples_for_field_types.rb +++ b/spec/shared_examples/shared_examples_for_field_types.rb @@ -34,3 +34,41 @@ expect(subject).to be_a(RailsAdmin::Config::Fields::Types::StringLike) end end + +RSpec.shared_examples 'a float-like field type' do |column_name| + subject do + RailsAdmin.config('FieldTest').fields.detect do |f| + f.name == column_name + end.with(object: FieldTest.new) + end + + describe '#html_attributes' do + it 'should contain a step attribute' do + expect(subject.html_attributes[:step]).to eq('any') + end + + it 'should contain a falsey required attribute' do + expect(subject.html_attributes[:required]).to be_falsey + end + + context 'when the field is required' do + before do + RailsAdmin.config FieldTest do + field column_name, :float do + required true + end + end + end + + it 'should contain a truthy required attribute' do + expect(subject.html_attributes[:required]).to be_truthy + end + end + end + + describe '#view_helper' do + it "uses the 'number' type input tag" do + expect(subject.view_helper).to eq(:number_field) + end + end +end