From cf9e51cb84b18ae63311552882637aece1a68b52 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 18:34:04 +0530 Subject: [PATCH 1/7] Moved Input specific methods to `Base` module --- lib/rails_bootstrap_form/inputs.rb | 13 ++++++------- lib/rails_bootstrap_form/inputs/base.rb | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 lib/rails_bootstrap_form/inputs/base.rb diff --git a/lib/rails_bootstrap_form/inputs.rb b/lib/rails_bootstrap_form/inputs.rb index fac65cc..04d921b 100644 --- a/lib/rails_bootstrap_form/inputs.rb +++ b/lib/rails_bootstrap_form/inputs.rb @@ -5,6 +5,12 @@ module RailsBootstrapForm module Inputs + extend ActiveSupport::Autoload + + autoload :Base + + include Base + FIELD_HELPERS = %i[ text_field url_field @@ -200,12 +206,5 @@ def collection_radio_buttons(attribute, collection, value_method, text_method, o inputs end - - def collection_input_checked?(checked, obj, input_value) - checked == input_value || Array(checked).try(:include?, input_value) || - checked == obj || Array(checked).try(:include?, obj) - end - - private :collection_input_checked? end end diff --git a/lib/rails_bootstrap_form/inputs/base.rb b/lib/rails_bootstrap_form/inputs/base.rb new file mode 100644 index 0000000..156a680 --- /dev/null +++ b/lib/rails_bootstrap_form/inputs/base.rb @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- +# -*- frozen_string_literal: true -*- +# -*- warn_indent: true -*- + +module RailsBootstrapForm + module Inputs + module Base + extend ActiveSupport::Concern + + def self.included(base_class) + def collection_input_checked?(checked, obj, input_value) + checked == input_value || Array(checked).try(:include?, input_value) || + checked == obj || Array(checked).try(:include?, obj) + end + + private :collection_input_checked? + end + end + end +end From b8813cf7063b855a764a52c92b8015097d36fbd8 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 19:44:03 +0530 Subject: [PATCH 2/7] Added wrapper for `collection_check_boxes` --- lib/rails_bootstrap_form/components/check_box.rb | 4 ++-- lib/rails_bootstrap_form/inputs.rb | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/rails_bootstrap_form/components/check_box.rb b/lib/rails_bootstrap_form/components/check_box.rb index 6eb03d2..27b8675 100644 --- a/lib/rails_bootstrap_form/components/check_box.rb +++ b/lib/rails_bootstrap_form/components/check_box.rb @@ -46,14 +46,14 @@ def check_box_classes(attribute, options) def check_box_label_class(attribute, bootstrap_options, options) classes = Array("form-check-label") << bootstrap_options.additional_label_class - classes << "required" if is_field_required?(attribute, options) + classes << "required" if is_field_required?(attribute, options) && !bootstrap_options.inline? classes << "is-invalid" if is_invalid?(attribute) classes << bootstrap_options.hide_class if bootstrap_options.hide_label classes.flatten.compact end def check_box_wrapper_class(bootstrap_options) - classes = ["mb-3", "form-check"] + classes = Array("form-check") classes << "form-switch" if bootstrap_options.switch classes << "form-check-inline" if bootstrap_options.inline? classes.flatten.compact diff --git a/lib/rails_bootstrap_form/inputs.rb b/lib/rails_bootstrap_form/inputs.rb index 04d921b..af797a2 100644 --- a/lib/rails_bootstrap_form/inputs.rb +++ b/lib/rails_bootstrap_form/inputs.rb @@ -140,8 +140,8 @@ def check_box(attribute, options = {}, checked_value = "1", unchecked_value = "0 check_box_html = tag.div(class: check_box_wrapper_class(bootstrap_options)) do concat(check_box_field) concat(check_box_label) - concat(check_box_help_text) - concat(generate_error(attribute)) if is_invalid?(attribute) + concat(check_box_help_text) unless bootstrap_options.inline? + concat(generate_error(attribute)) if is_invalid?(attribute) && !bootstrap_options.inline? end check_box_html @@ -176,14 +176,18 @@ def collection_check_boxes(attribute, collection, value_method, text_method, opt input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method) input_options = { bootstrap_form: { - label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method) + label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method), } }.deep_merge!(options) inputs << check_box(attribute, input_options, input_value, nil) end - inputs + field_wrapper_builder(attribute, options, html_options) do + concat(tag.div(control_specific_class(:collection_check_boxes)) do + concat(inputs) + end) + end end def collection_radio_buttons(attribute, collection, value_method, text_method, options = {}, html_options = {}, &block) From 5b08099c6c45fffe2e20bf47985b7bf0f4a81f70 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 19:55:22 +0530 Subject: [PATCH 3/7] Added wrapper for `collection_radio_buttons` --- lib/rails_bootstrap_form/components/radio_button.rb | 4 ++-- lib/rails_bootstrap_form/inputs.rb | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/rails_bootstrap_form/components/radio_button.rb b/lib/rails_bootstrap_form/components/radio_button.rb index f5a9b6e..6882b03 100644 --- a/lib/rails_bootstrap_form/components/radio_button.rb +++ b/lib/rails_bootstrap_form/components/radio_button.rb @@ -43,14 +43,14 @@ def radio_button_classes(attribute, options) def radio_button_label_class(attribute, bootstrap_options, options) classes = Array("form-check-label") << bootstrap_options.additional_label_class - classes << "required" if is_field_required?(attribute, options) + classes << "required" if is_field_required?(attribute, options) && !bootstrap_options.inline? classes << "is-invalid" if is_invalid?(attribute) classes << bootstrap_options.hide_class if bootstrap_options.hide_label classes.flatten.compact end def radio_button_wrapper_class(bootstrap_options) - classes = ["mb-3", "form-check"] + classes = Array("form-check") classes << "form-check-inline" if bootstrap_options.inline? classes.flatten.compact end diff --git a/lib/rails_bootstrap_form/inputs.rb b/lib/rails_bootstrap_form/inputs.rb index af797a2..95bc31e 100644 --- a/lib/rails_bootstrap_form/inputs.rb +++ b/lib/rails_bootstrap_form/inputs.rb @@ -160,8 +160,8 @@ def radio_button(attribute, value, options = {}) radio_button_html = tag.div(class: radio_button_wrapper_class(bootstrap_options)) do concat(radio_button_field) concat(radio_button_label) - concat(radio_button_help_text) - concat(generate_error(attribute)) if is_invalid?(attribute) + concat(radio_button_help_text) unless bootstrap_options.inline? + concat(generate_error(attribute)) if is_invalid?(attribute) && !bootstrap_options.inline? end radio_button_html @@ -176,7 +176,7 @@ def collection_check_boxes(attribute, collection, value_method, text_method, opt input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method) input_options = { bootstrap_form: { - label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method), + label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method) } }.deep_merge!(options) @@ -208,7 +208,11 @@ def collection_radio_buttons(attribute, collection, value_method, text_method, o inputs << radio_button(attribute, input_value, input_options) end - inputs + field_wrapper_builder(attribute, options, html_options) do + concat(tag.div(control_specific_class(:collection_radio_buttons)) do + concat(inputs) + end) + end end end end From 6bb55dcc78917d3448de5b78dadc2341b2d7f680 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 20:01:39 +0530 Subject: [PATCH 4/7] Moved `control_specific_class` to `Base` --- lib/rails_bootstrap_form/bootstrap_form_builder.rb | 6 +----- lib/rails_bootstrap_form/inputs/base.rb | 6 +++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/rails_bootstrap_form/bootstrap_form_builder.rb b/lib/rails_bootstrap_form/bootstrap_form_builder.rb index eead1b8..fde7888 100644 --- a/lib/rails_bootstrap_form/bootstrap_form_builder.rb +++ b/lib/rails_bootstrap_form/bootstrap_form_builder.rb @@ -25,10 +25,6 @@ def apply_default_form_options(options) options[:html].reverse_merge!(RailsBootstrapForm.config.default_form_attributes) end - def control_specific_class(field_tag_name) - "rails-bootstrap-forms-#{field_tag_name.to_s.tr("_", "-")}" - end - - private :apply_default_form_options, :control_specific_class + private :apply_default_form_options end end diff --git a/lib/rails_bootstrap_form/inputs/base.rb b/lib/rails_bootstrap_form/inputs/base.rb index 156a680..5bb314e 100644 --- a/lib/rails_bootstrap_form/inputs/base.rb +++ b/lib/rails_bootstrap_form/inputs/base.rb @@ -13,7 +13,11 @@ def collection_input_checked?(checked, obj, input_value) checked == obj || Array(checked).try(:include?, obj) end - private :collection_input_checked? + def control_specific_class(field_tag_name) + "rails-bootstrap-forms-#{field_tag_name.to_s.tr("_", "-")}" + end + + private :collection_input_checked?, :control_specific_class end end end From e1f165e8368a89de9a496b208692716c87c5856c Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 20:02:09 +0530 Subject: [PATCH 5/7] Changes to include `hidden` field in `collection_check_box` --- lib/rails_bootstrap_form/inputs.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/rails_bootstrap_form/inputs.rb b/lib/rails_bootstrap_form/inputs.rb index 95bc31e..931e636 100644 --- a/lib/rails_bootstrap_form/inputs.rb +++ b/lib/rails_bootstrap_form/inputs.rb @@ -183,8 +183,12 @@ def collection_check_boxes(attribute, collection, value_method, text_method, opt inputs << check_box(attribute, input_options, input_value, nil) end + if options.delete(:include_hidden) { true } + inputs.prepend hidden_field(attribute, value: "", multiple: true) + end + field_wrapper_builder(attribute, options, html_options) do - concat(tag.div(control_specific_class(:collection_check_boxes)) do + concat(tag.div(class: control_specific_class(:collection_check_boxes)) do concat(inputs) end) end @@ -209,7 +213,7 @@ def collection_radio_buttons(attribute, collection, value_method, text_method, o end field_wrapper_builder(attribute, options, html_options) do - concat(tag.div(control_specific_class(:collection_radio_buttons)) do + concat(tag.div(class: control_specific_class(:collection_radio_buttons)) do concat(inputs) end) end From 2ae2f9fd8437d6ebda5184a4f2f5507958d14d96 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 20:26:52 +0530 Subject: [PATCH 6/7] Changes in demo application --- demo/app/views/users/_vertical_form.html.erb | 2 +- demo/config/locales/en.rb | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/demo/app/views/users/_vertical_form.html.erb b/demo/app/views/users/_vertical_form.html.erb index 3163a04..aa51aae 100644 --- a/demo/app/views/users/_vertical_form.html.erb +++ b/demo/app/views/users/_vertical_form.html.erb @@ -18,7 +18,7 @@ <%= form.fields_for :address, include_id: false do |address_form| %> <%= address_form.text_area :street %> <%= address_form.text_field :state %> - <%= address_form.grouped_collection_select :city, ::Country.all, :cities, :name, :id, :name %> + <%= address_form.grouped_collection_select :city, ::Country.all, :cities, :name, :id, :name, {include_blank: "Select city"} %> <%= address_form.text_field :postal_code %> <%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id), {include_blank: "Select Country", bootstrap_form: {}} %> diff --git a/demo/config/locales/en.rb b/demo/config/locales/en.rb index 1f97f30..e532bed 100644 --- a/demo/config/locales/en.rb +++ b/demo/config/locales/en.rb @@ -43,7 +43,9 @@ help_texts: { user: { email: "Please use official email address", - terms: "You must first accept terms and conditions in order to continue" + terms: "You must first accept terms and conditions in order to continue", + skill_ids: "Select your strong skills", + fruit_id: "Select your favorite fruit" } }, } From 4d7ca90c75255187eb58386688d18659e319df19 Mon Sep 17 00:00:00 2001 From: Harshal LADHE Date: Sat, 20 May 2023 20:27:27 +0530 Subject: [PATCH 7/7] Bump version to `0.5.1` --- Gemfile.lock | 2 +- lib/rails_bootstrap_form/version.rb | 2 +- spec/rails_bootstrap_form_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b0f2c12..1eb2bf2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - rails_bootstrap_form (0.5.0) + rails_bootstrap_form (0.5.1) GEM remote: http://rubygems.org/ diff --git a/lib/rails_bootstrap_form/version.rb b/lib/rails_bootstrap_form/version.rb index 5eb111c..97bf3b6 100644 --- a/lib/rails_bootstrap_form/version.rb +++ b/lib/rails_bootstrap_form/version.rb @@ -3,6 +3,6 @@ # -*- warn_indent: true -*- module RailsBootstrapForm - VERSION = "0.5.0".freeze + VERSION = "0.5.1".freeze REQUIRED_RAILS_VERSION = "~> 7.0".freeze end diff --git a/spec/rails_bootstrap_form_spec.rb b/spec/rails_bootstrap_form_spec.rb index c2cd461..4ec97c2 100644 --- a/spec/rails_bootstrap_form_spec.rb +++ b/spec/rails_bootstrap_form_spec.rb @@ -6,7 +6,7 @@ RSpec.describe RailsBootstrapForm do it "has a valid version number" do - expect(RailsBootstrapForm::VERSION).to eq("0.5.0") + expect(RailsBootstrapForm::VERSION).to eq("0.5.1") end it "has a valid rails version number" do