diff --git a/lib/rails_admin/config/fields/types/action_text.rb b/lib/rails_admin/config/fields/types/action_text.rb index 276308f287..221ac80c32 100644 --- a/lib/rails_admin/config/fields/types/action_text.rb +++ b/lib/rails_admin/config/fields/types/action_text.rb @@ -1,11 +1,10 @@ -require 'rails_admin/config/fields/base' require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class ActionText < RailsAdmin::Config::Fields::Types::Text + class ActionText < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/lib/rails_admin/config/fields/types/ck_editor.rb b/lib/rails_admin/config/fields/types/ck_editor.rb index 170bba4c17..f1f4f439bd 100644 --- a/lib/rails_admin/config/fields/types/ck_editor.rb +++ b/lib/rails_admin/config/fields/types/ck_editor.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class CKEditor < RailsAdmin::Config::Fields::Types::Text + class CKEditor < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/lib/rails_admin/config/fields/types/code_mirror.rb b/lib/rails_admin/config/fields/types/code_mirror.rb index e1c66b5b45..0d45a16ae7 100644 --- a/lib/rails_admin/config/fields/types/code_mirror.rb +++ b/lib/rails_admin/config/fields/types/code_mirror.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class CodeMirror < RailsAdmin::Config::Fields::Types::Text + class CodeMirror < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/lib/rails_admin/config/fields/types/color.rb b/lib/rails_admin/config/fields/types/color.rb index c048331403..554d2acbcc 100644 --- a/lib/rails_admin/config/fields/types/color.rb +++ b/lib/rails_admin/config/fields/types/color.rb @@ -1,19 +1,12 @@ -require 'rails_admin/config/fields/base' -require 'rails_admin/config/fields/types/string' +require 'rails_admin/config/fields/types/string_like' module RailsAdmin module Config module Fields module Types - class Color < RailsAdmin::Config::Fields::Types::String + class Color < StringLike RailsAdmin::Config::Fields::Types.register(self) - register_instance_option :html_attributes do - { - required: required?, - } - end - register_instance_option :pretty_value do bindings[:view].content_tag :strong, (value.presence || ' - '), style: "color: #{color}" end diff --git a/lib/rails_admin/config/fields/types/froala.rb b/lib/rails_admin/config/fields/types/froala.rb index bce6530b1c..a88cc78013 100644 --- a/lib/rails_admin/config/fields/types/froala.rb +++ b/lib/rails_admin/config/fields/types/froala.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class Froala < RailsAdmin::Config::Fields::Types::Text + class Froala < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/lib/rails_admin/config/fields/types/hidden.rb b/lib/rails_admin/config/fields/types/hidden.rb index 2f12148844..568ec96828 100644 --- a/lib/rails_admin/config/fields/types/hidden.rb +++ b/lib/rails_admin/config/fields/types/hidden.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/string_like' module RailsAdmin module Config module Fields module Types - class Hidden < RailsAdmin::Config::Fields::Base + class Hidden < StringLike RailsAdmin::Config::Fields::Types.register(self) register_instance_option :view_helper do @@ -22,10 +22,6 @@ class Hidden < RailsAdmin::Config::Fields::Base def generic_help false end - - def parse_input(params) - params[name] = params[name].presence if params.key?(name) - end end end end diff --git a/lib/rails_admin/config/fields/types/simple_mde.rb b/lib/rails_admin/config/fields/types/simple_mde.rb index 3cd0b065a2..ffd72949c0 100644 --- a/lib/rails_admin/config/fields/types/simple_mde.rb +++ b/lib/rails_admin/config/fields/types/simple_mde.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class SimpleMDE < RailsAdmin::Config::Fields::Types::Text + class SimpleMDE < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/lib/rails_admin/config/fields/types/string.rb b/lib/rails_admin/config/fields/types/string.rb index b05fadefc3..e0a322f868 100644 --- a/lib/rails_admin/config/fields/types/string.rb +++ b/lib/rails_admin/config/fields/types/string.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/string_like' module RailsAdmin module Config module Fields module Types - class String < RailsAdmin::Config::Fields::Base + class String < StringLike RailsAdmin::Config::Fields::Types.register(self) def input_size @@ -38,10 +38,6 @@ def generic_help text end - def parse_input(params) - params[name] = params[name].presence if params.key?(name) - end - register_instance_option :partial do :form_field end diff --git a/lib/rails_admin/config/fields/types/string_like.rb b/lib/rails_admin/config/fields/types/string_like.rb new file mode 100644 index 0000000000..fcbf564844 --- /dev/null +++ b/lib/rails_admin/config/fields/types/string_like.rb @@ -0,0 +1,19 @@ +require 'rails_admin/config/fields/base' + +module RailsAdmin + module Config + module Fields + module Types + class StringLike < RailsAdmin::Config::Fields::Base + register_instance_option :treat_empty_as_nil? do + properties.try(:nullable?) + end + + def parse_input(params) + params[name] = params[name].presence if params.key?(name) && treat_empty_as_nil? + end + end + end + end + end +end diff --git a/lib/rails_admin/config/fields/types/text.rb b/lib/rails_admin/config/fields/types/text.rb index 5577ebae8b..3fb6ff2099 100644 --- a/lib/rails_admin/config/fields/types/text.rb +++ b/lib/rails_admin/config/fields/types/text.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/string_like' module RailsAdmin module Config module Fields module Types - class Text < RailsAdmin::Config::Fields::Base + class Text < StringLike # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) @@ -16,10 +16,6 @@ class Text < RailsAdmin::Config::Fields::Base } end - def parse_input(params) - params[name] = params[name].presence if params.key?(name) - end - register_instance_option :partial do :form_text end diff --git a/lib/rails_admin/config/fields/types/wysihtml5.rb b/lib/rails_admin/config/fields/types/wysihtml5.rb index 5d889b441c..f7a3b7ea88 100644 --- a/lib/rails_admin/config/fields/types/wysihtml5.rb +++ b/lib/rails_admin/config/fields/types/wysihtml5.rb @@ -1,10 +1,10 @@ -require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/text' module RailsAdmin module Config module Fields module Types - class Wysihtml5 < RailsAdmin::Config::Fields::Types::Text + class Wysihtml5 < Text # Register field type for the type loader RailsAdmin::Config::Fields::Types.register(self) diff --git a/spec/rails_admin/config/fields/types/action_text_spec.rb b/spec/rails_admin/config/fields/types/action_text_spec.rb index cc02ae8bc2..89f48dce66 100644 --- a/spec/rails_admin/config/fields/types/action_text_spec.rb +++ b/spec/rails_admin/config/fields/types/action_text_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::ActionText do it_behaves_like 'a generic field type', :action_text_field - it_behaves_like 'a string-ish field type', :action_text_field + it_behaves_like 'a string-like field type', :action_text_field end if defined?(ActionText) diff --git a/spec/rails_admin/config/fields/types/ck_editor_spec.rb b/spec/rails_admin/config/fields/types/ck_editor_spec.rb index eb889ed2f9..e96b769675 100644 --- a/spec/rails_admin/config/fields/types/ck_editor_spec.rb +++ b/spec/rails_admin/config/fields/types/ck_editor_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::CKEditor do it_behaves_like 'a generic field type', :text_field, :ck_editor - it_behaves_like 'a string-ish field type', :text_field, :ck_editor + it_behaves_like 'a string-like field type', :text_field, :ck_editor end diff --git a/spec/rails_admin/config/fields/types/code_mirror_spec.rb b/spec/rails_admin/config/fields/types/code_mirror_spec.rb index 5297c67c83..8baa35c2c1 100644 --- a/spec/rails_admin/config/fields/types/code_mirror_spec.rb +++ b/spec/rails_admin/config/fields/types/code_mirror_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::CodeMirror do it_behaves_like 'a generic field type', :text_field, :code_mirror - it_behaves_like 'a string-ish field type', :text_field, :code_mirror + it_behaves_like 'a string-like field type', :text_field, :code_mirror end diff --git a/spec/rails_admin/config/fields/types/color_spec.rb b/spec/rails_admin/config/fields/types/color_spec.rb index afe003e482..8bd545dfbd 100644 --- a/spec/rails_admin/config/fields/types/color_spec.rb +++ b/spec/rails_admin/config/fields/types/color_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::Color do it_behaves_like 'a generic field type', :string_field, :color - it_behaves_like 'a string-ish field type', :string_field, :color + it_behaves_like 'a string-like field type', :string_field, :color end diff --git a/spec/rails_admin/config/fields/types/froala_spec.rb b/spec/rails_admin/config/fields/types/froala_spec.rb index 2f1dd1fe68..19d207bf19 100644 --- a/spec/rails_admin/config/fields/types/froala_spec.rb +++ b/spec/rails_admin/config/fields/types/froala_spec.rb @@ -2,4 +2,6 @@ RSpec.describe RailsAdmin::Config::Fields::Types::Froala do it_behaves_like 'a generic field type', :text_field, :froala + + it_behaves_like 'a string-like field type', :text_field, :froala end diff --git a/spec/rails_admin/config/fields/types/hidden_spec.rb b/spec/rails_admin/config/fields/types/hidden_spec.rb index 9d3ce7d46d..ca60e2fdc0 100644 --- a/spec/rails_admin/config/fields/types/hidden_spec.rb +++ b/spec/rails_admin/config/fields/types/hidden_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::Hidden do it_behaves_like 'a generic field type', :integer_field, :hidden - it_behaves_like 'a string-ish field type', :string_field, :hidden + it_behaves_like 'a string-like field type', :string_field, :hidden end diff --git a/spec/rails_admin/config/fields/types/simple_mde_spec.rb b/spec/rails_admin/config/fields/types/simple_mde_spec.rb index b9236234fc..6739e412b5 100644 --- a/spec/rails_admin/config/fields/types/simple_mde_spec.rb +++ b/spec/rails_admin/config/fields/types/simple_mde_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::SimpleMDE do it_behaves_like 'a generic field type', :text_field, :simple_mde - it_behaves_like 'a string-ish field type', :text_field, :simple_mde + it_behaves_like 'a string-like field type', :text_field, :simple_mde end diff --git a/spec/rails_admin/config/fields/types/string_like_spec.rb b/spec/rails_admin/config/fields/types/string_like_spec.rb new file mode 100644 index 0000000000..c4c5fb3648 --- /dev/null +++ b/spec/rails_admin/config/fields/types/string_like_spec.rb @@ -0,0 +1,83 @@ +require 'spec_helper' + +RSpec.describe RailsAdmin::Config::Fields::Types::StringLike do + describe '#treat_empty_as_nil?', active_record: true do + context 'with a nullable field' do + subject do + RailsAdmin.config('Team').fields.detect do |f| + f.name == :name + end.with(object: Team.new) + end + + it 'is true' do + expect(subject.treat_empty_as_nil?).to be true + end + end + + context 'with a non-nullable field' do + subject do + RailsAdmin.config('Team').fields.detect do |f| + f.name == :manager + end.with(object: Team.new) + end + + it 'is false' do + expect(subject.treat_empty_as_nil?).to be false + end + end + end + + describe '#parse_input' do + subject do + RailsAdmin.config('FieldTest').fields.detect do |f| + f.name == :string_field + end.with(object: FieldTest.new) + end + + context 'with treat_empty_as_nil being true' do + before do + RailsAdmin.config FieldTest do + field :string_field do + treat_empty_as_nil true + end + end + end + + context 'when value is empty' do + let(:params) { {string_field: ''} } + + it 'makes the value nil' do + subject.parse_input(params) + expect(params.key?(:string_field)).to be true + expect(params[:string_field]).to be nil + end + end + + context 'when value does not exist in params' do + let(:params) { {} } + + it 'does not touch params' do + subject.parse_input(params) + expect(params.key?(:string_field)).to be false + end + end + end + + context 'with treat_empty_as_nil being false' do + before do + RailsAdmin.config FieldTest do + field :string_field do + treat_empty_as_nil false + end + end + end + let(:params) { {string_field: ''} } + + it 'keeps the value untouched' do + subject.parse_input(params) + expect(params.key?(:string_field)).to be true + expect(params[:string_field]).to eq '' + end + end + end +end diff --git a/spec/rails_admin/config/fields/types/string_spec.rb b/spec/rails_admin/config/fields/types/string_spec.rb index 50073ada07..49b95a1e9b 100644 --- a/spec/rails_admin/config/fields/types/string_spec.rb +++ b/spec/rails_admin/config/fields/types/string_spec.rb @@ -25,5 +25,5 @@ it_behaves_like 'a generic field type', :string_field - it_behaves_like 'a string-ish field type', :text_field + it_behaves_like 'a string-like field type', :string_field end diff --git a/spec/rails_admin/config/fields/types/text_spec.rb b/spec/rails_admin/config/fields/types/text_spec.rb index 2351ecc728..e95cac06b6 100644 --- a/spec/rails_admin/config/fields/types/text_spec.rb +++ b/spec/rails_admin/config/fields/types/text_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::Text do it_behaves_like 'a generic field type', :text_field - it_behaves_like 'a string-ish field type', :text_field + it_behaves_like 'a string-like field type', :text_field end diff --git a/spec/rails_admin/config/fields/types/wysihtml5_spec.rb b/spec/rails_admin/config/fields/types/wysihtml5_spec.rb index e58dba7062..0811459c00 100644 --- a/spec/rails_admin/config/fields/types/wysihtml5_spec.rb +++ b/spec/rails_admin/config/fields/types/wysihtml5_spec.rb @@ -3,5 +3,5 @@ RSpec.describe RailsAdmin::Config::Fields::Types::Wysihtml5 do it_behaves_like 'a generic field type', :text_field, :wysihtml5 - it_behaves_like 'a string-ish field type', :text_field, :wysihtml5 + it_behaves_like 'a string-like field type', :text_field, :wysihtml5 end diff --git a/spec/shared_examples/shared_examples_for_field_types.rb b/spec/shared_examples/shared_examples_for_field_types.rb index 3cd5508440..2dec54b547 100644 --- a/spec/shared_examples/shared_examples_for_field_types.rb +++ b/spec/shared_examples/shared_examples_for_field_types.rb @@ -23,36 +23,14 @@ end end -RSpec.shared_examples 'a string-ish field type' do |column_name, field_type| - describe '#parse_input' do - before do - RailsAdmin.config FieldTest do - field column_name, field_type - end - end - subject do - RailsAdmin.config('FieldTest').fields.detect do |f| - f.name == column_name - end.with(object: FieldTest.new) - end - - context 'when value is empty' do - let(:params) { {column_name => ''} } - - it 'makes the value nil' do - subject.parse_input(params) - expect(params.key?(column_name)).to be true - expect(params[column_name]).to be nil - end - end - - context 'when value does not exist in params' do - let(:params) { {} } +RSpec.shared_examples 'a string-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 - it 'does not touch params' do - subject.parse_input(params) - expect(params.key?(column_name)).to be false - end - end + it 'is a StringLike field' do + expect(subject).to be_a(RailsAdmin::Config::Fields::Types::StringLike) end end