Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rails edge compatibility #945

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Metrics/MethodLength:
- 'test/**/*'

Metrics/ModuleLength:
Max: 101
Max: 109
Exclude:
- 'test/**/*'

Expand Down
13 changes: 12 additions & 1 deletion lib/client_side_validations/action_view/form_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ module ActionView
module Helpers
module FormBuilder
def self.prepended(base)
(base.field_helpers - %i[label check_box radio_button fields_for fields hidden_field file_field]).each do |selector|
selectors = base.field_helpers - %i[label check_box checkbox radio_button fields_for fields hidden_field file_field]

selectors.each do |selector|
base.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
# Cannot call super here, rewrite all
def #{selector}(method, options = {}) # def text_field(method, options = {})
Expand All @@ -19,6 +21,10 @@ def #{selector}(method, options = {}) # def text_field(method, options = {
end # end
RUBY_EVAL
end

base.class_eval do
alias_method :text_area, :textarea if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:textarea)
end
end

def initialize(object_name, object, template, options)
Expand Down Expand Up @@ -47,6 +53,7 @@ def check_box(method, options = {}, checked_value = '1', unchecked_value = '0')
options.delete(:validate)
super
end
alias checkbox check_box if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:checkbox)

%i[collection_check_boxes collection_radio_buttons].each do |method_name|
define_method method_name do |method, collection, value_method, text_method, options = {}, html_options = {}, &block|
Expand All @@ -56,6 +63,10 @@ def check_box(method, options = {}, checked_value = '1', unchecked_value = '0')
end
end

if ::ActionView::Helpers::FormBuilder.public_instance_methods.include?(:collection_checkboxes)
alias collection_checkboxes collection_check_boxes
end

def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
build_validation_options(method, html_options.merge(name: options[:name]))
html_options.delete(:validate)
Expand Down
46 changes: 46 additions & 0 deletions test/action_view/cases/test_form_for_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ def test_text_area
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:textarea)
def test_textarea
form_for(@post, validate: true) do |f|
concat f.textarea(:cost)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
form_field('textarea', id: 'post_cost', name: 'post[cost]', tag_content: "\n")
end

assert_dom_equal expected, output_buffer
end
end

def test_file_field
form_for(@post, validate: true) do |f|
concat f.file_field(:cost)
Expand Down Expand Up @@ -97,6 +112,22 @@ def test_check_box
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:checkbox)
def test_checkbox
form_for(@post, validate: true) do |f|
concat f.checkbox(:cost)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
end

assert_dom_equal expected, output_buffer
end
end

def test_check_box_ensure_no_validate_attribute
form_for(@post, validate: true) do |f|
concat f.check_box(:cost, validate: true)
Expand Down Expand Up @@ -425,6 +456,21 @@ def test_collection_check_boxes
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.public_instance_methods.include?(:collection_checkboxes)
def test_collection_checkboxes
form_for(@post, validate: true) do |f|
concat f.collection_checkboxes(:cost, [], :id, :name)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
end

assert_dom_equal expected, output_buffer
end
end

def test_collection_check_boxes_with_validate_options
form_for(@post, validate: true) do |f|
concat f.collection_check_boxes(:cost, [], :id, :name, {}, validate: false)
Expand Down
46 changes: 46 additions & 0 deletions test/action_view/cases/test_form_with_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,21 @@ def test_form_with_text_area
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:textarea)
def test_form_with_textarea
form_with(model: @post, validate: true) do |f|
concat f.textarea(:cost)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_with('/posts', validators: validators) do
form_field('textarea', id: 'post_cost', name: 'post[cost]', tag_content: "\n")
end

assert_dom_equal expected, output_buffer
end
end

def test_form_with_file_field
form_with(model: @post, validate: true) do |f|
concat f.file_field(:cost)
Expand Down Expand Up @@ -122,6 +137,22 @@ def test_form_with_check_box
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:checkbox)
def test_form_with_checkbox
form_with(model: @post, validate: true) do |f|
concat f.checkbox(:cost)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_with('/posts', validators: validators) do
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
end

assert_dom_equal expected, output_buffer
end
end

def test_form_with_check_box_ensure_no_validate_attribute
form_with(model: @post, validate: true) do |f|
concat f.check_box(:cost, validate: true)
Expand Down Expand Up @@ -440,6 +471,21 @@ def test_form_with_collection_check_boxes
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.public_instance_methods.include?(:collection_checkboxes)
def test_form_with_collection_checkboxes
form_with(model: @post, validate: true) do |f|
concat f.collection_checkboxes(:cost, [], :id, :name)
end

validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
expected = whole_form_with('/posts', validators: validators) do
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
end

assert_dom_equal expected, output_buffer
end
end

def test_form_with_collection_check_boxes_with_validate_options
form_with(model: @post, validate: true) do |f|
concat f.collection_check_boxes(:cost, [], :id, :name, {}, validate: false)
Expand Down
29 changes: 29 additions & 0 deletions test/action_view/cases/test_legacy_form_for_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,20 @@ def test_text_area
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:textarea)
def test_textarea
form_for(@post) do |f|
concat f.textarea(:cost)
end

expected = whole_form_for('/posts', 'new_post', 'new_post') do
form_field('textarea', id: 'post_cost', name: 'post[cost]', tag_content: "\n")
end

assert_dom_equal expected, output_buffer
end
end

def test_file_field
form_for(@post) do |f|
concat f.file_field(:cost)
Expand All @@ -57,6 +71,21 @@ def test_check_box
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:checkbox)
def test_checkbox
form_for(@post) do |f|
concat f.checkbox(:cost)
end

expected = whole_form_for('/posts', 'new_post', 'new_post') do
hidden_input_for_checkbox('post[cost]') +
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
end

assert_dom_equal expected, output_buffer
end
end

def test_radio_button
form_for(@post) do |f|
concat f.radio_button(:cost, '10')
Expand Down
29 changes: 29 additions & 0 deletions test/action_view/cases/test_legacy_form_with_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@ def test_form_with_text_area
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:textarea)
def test_form_with_textarea
form_with(model: @post) do |f|
concat f.textarea(:cost)
end

expected = whole_form_with('/posts') do
form_field('textarea', name: 'post[cost]', id: 'post_cost', tag_content: "\n")
end

assert_dom_equal expected, output_buffer
end
end

def test_form_with_file_field
form_with(model: @post) do |f|
concat f.file_field(:cost)
Expand All @@ -58,6 +72,21 @@ def test_form_with_check_box
assert_dom_equal expected, output_buffer
end

if ::ActionView::Helpers::FormBuilder.field_helpers.include?(:checkbox)
def test_form_with_checkbox
form_with(model: @post) do |f|
concat f.checkbox(:cost)
end

expected = whole_form_with('/posts') do
hidden_input_for_checkbox('post[cost]') +
form_field('input', name: 'post[cost]', id: 'post_cost', type: 'checkbox', value: '1')
end

assert_dom_equal expected, output_buffer
end
end

def test_form_with_radio_button
form_with(model: @post) do |f|
concat f.radio_button(:cost, '10')
Expand Down