From 084c876643ba7cb8454c8a3376fbad9eb9f05e35 Mon Sep 17 00:00:00 2001 From: Gregor Wassmann Date: Wed, 23 Nov 2022 17:06:30 +0100 Subject: [PATCH] Add default_builder configuration option For some CSS frameworks the current Simple Form configuration options are not enough. In particular, the error notification may require [additional nesting](https://github.com/abevoelker/simple_form_tailwind_css/blob/master/lib/simple_form/tailwind/error_notification.rb). But also data attributes on some wrappers may be [required](https://react.carbondesignsystem.com/?path=/story/components-textinput--playground&args=invalid:true). By introducing the `default_builder` configuration option any framework should be able to be configured. In the case of https://github.com/abevoelker/simple_form_tailwind_css this would allow to use ```erb <%= simple_form_for(@foo) do |f| %> ``` instead of ```erb <%= simple_form_for(@foo, builder: SimpleForm::Tailwind::FormBuilder) do |f| %> ``` --- .../simple_form/templates/config/initializers/simple_form.rb | 3 +++ lib/simple_form.rb | 3 +++ lib/simple_form/action_view_extensions/builder.rb | 2 +- lib/simple_form/action_view_extensions/form_helper.rb | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/generators/simple_form/templates/config/initializers/simple_form.rb b/lib/generators/simple_form/templates/config/initializers/simple_form.rb index d26878480..7e9a7a689 100644 --- a/lib/generators/simple_form/templates/config/initializers/simple_form.rb +++ b/lib/generators/simple_form/templates/config/initializers/simple_form.rb @@ -173,4 +173,7 @@ # Defines validation classes to the input_field. By default it's nil. # config.input_field_valid_class = 'is-valid' # config.input_field_error_class = 'is-invalid' + + # Defines the default form builder when more customization is needed. + # config.default_builder = 'SimpleForm::OtherCSSFramework::FormBuilder' end diff --git a/lib/simple_form.rb b/lib/simple_form.rb index e813398a3..08a8920b0 100644 --- a/lib/simple_form.rb +++ b/lib/simple_form.rb @@ -213,6 +213,9 @@ def self.configured? #:nodoc: mattr_accessor :input_field_valid_class @@input_field_valid_class = nil + mattr_accessor :default_builder + @@default_builder = 'SimpleForm::FormBuilder' + # Retrieves a given wrapper def self.wrapper(name) @@wrappers[name.to_s] or raise WrapperNotFound, "Couldn't find wrapper with name #{name}" diff --git a/lib/simple_form/action_view_extensions/builder.rb b/lib/simple_form/action_view_extensions/builder.rb index 7af4ecc08..2c453cbe4 100644 --- a/lib/simple_form/action_view_extensions/builder.rb +++ b/lib/simple_form/action_view_extensions/builder.rb @@ -23,7 +23,7 @@ def simple_fields_for(*args, &block) if self.class < ActionView::Helpers::FormBuilder options[:builder] ||= self.class else - options[:builder] ||= SimpleForm::FormBuilder + options[:builder] ||= SimpleForm.default_builder.constantize end fields_for(*args, options, &block) end diff --git a/lib/simple_form/action_view_extensions/form_helper.rb b/lib/simple_form/action_view_extensions/form_helper.rb index 6981aa983..8b404fc64 100644 --- a/lib/simple_form/action_view_extensions/form_helper.rb +++ b/lib/simple_form/action_view_extensions/form_helper.rb @@ -12,7 +12,7 @@ module ActionViewExtensions module FormHelper def simple_form_for(record, options = {}, &block) - options[:builder] ||= SimpleForm::FormBuilder + options[:builder] ||= SimpleForm.default_builder.constantize options[:html] ||= {} unless options[:html].key?(:novalidate) options[:html][:novalidate] = !SimpleForm.browser_validations @@ -30,7 +30,7 @@ def simple_form_for(record, options = {}, &block) def simple_fields_for(record_name, record_object = nil, options = {}, &block) options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options? - options[:builder] ||= SimpleForm::FormBuilder + options[:builder] ||= SimpleForm.default_builder.constantize with_simple_form_field_error_proc do fields_for(record_name, record_object, options, &block)