Skip to content

Commit

Permalink
Handle disabled elements when submitting
Browse files Browse the repository at this point in the history
  • Loading branch information
bcardarella committed Oct 8, 2012
1 parent bfa32d3 commit 614c086
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 27 deletions.
49 changes: 27 additions & 22 deletions coffeescript/rails.validations.coffee
Expand Up @@ -38,7 +38,7 @@ validateForm = (form, validators) ->
form.trigger('form:validate:before.ClientSideValidations')

valid = true
form.find(':input:enabled').each ->
form.find(':input:enabled:visible[data-validate]').each ->
valid = false unless $(@).isValid(validators)
# we don't want the loop to break out by mistake
true
Expand Down Expand Up @@ -120,6 +120,8 @@ window.ClientSideValidations.disable = (target) ->
$target.off('.ClientSideValidations')
$target.removeData('valid')
$target.removeData('changed')
$target.filter(':input').each ->
$(@).removeAttr('data-validate')

window.ClientSideValidations.enablers =
form: (form) ->
Expand Down Expand Up @@ -152,33 +154,36 @@ window.ClientSideValidations.enablers =
form = input.form
$form = $(form)

$input.filter(':enabled:not(:radio):not([id$=_confirmation])').on(event, binding) for event, binding of {
'focusout.ClientSideValidations': ->
$(@).isValid(form.ClientSideValidations.settings.validators)
'change.ClientSideValidations': -> $(@).data('changed', true)
# Callbacks
'element:validate:after.ClientSideValidations': (eventData) -> ClientSideValidations.callbacks.element.after($(@), eventData)
'element:validate:before.ClientSideValidations': (eventData) -> ClientSideValidations.callbacks.element.before($(@), eventData)
'element:validate:fail.ClientSideValidations': (eventData, message) ->
element = $(@)
ClientSideValidations.callbacks.element.fail(element, message, ->
form.ClientSideValidations.addError(element, message)
, eventData)
'element:validate:pass.ClientSideValidations': (eventData) ->
element = $(@)
ClientSideValidations.callbacks.element.pass(element, ->
form.ClientSideValidations.removeError(element)
, eventData)
}

$input.filter(':checkbox').on('click.ClientSideValidations', ->
$input.filter(':enabled:not(:radio):not([id$=_confirmation]):visible')
.each ->
$(@).attr('data-validate', true)
.on(event, binding) for event, binding of {
'focusout.ClientSideValidations': ->
$(@).isValid(form.ClientSideValidations.settings.validators)
'change.ClientSideValidations': -> $(@).data('changed', true)
# Callbacks
'element:validate:after.ClientSideValidations': (eventData) -> ClientSideValidations.callbacks.element.after($(@), eventData)
'element:validate:before.ClientSideValidations': (eventData) -> ClientSideValidations.callbacks.element.before($(@), eventData)
'element:validate:fail.ClientSideValidations': (eventData, message) ->
element = $(@)
ClientSideValidations.callbacks.element.fail(element, message, ->
form.ClientSideValidations.addError(element, message)
, eventData)
'element:validate:pass.ClientSideValidations': (eventData) ->
element = $(@)
ClientSideValidations.callbacks.element.pass(element, ->
form.ClientSideValidations.removeError(element)
, eventData)
}

$input.filter(':checkbox:visible').on('click.ClientSideValidations', ->
$(@).isValid(form.ClientSideValidations.settings.validators)
# If we don't return true here the checkbox will immediately uncheck itself.
return true
)

# Inputs for confirmations
$input.filter('[id$=_confirmation]').each ->
$input.filter('[id$=_confirmation]:visible').each ->
confirmationElement = $(@)
element = $form.find("##{@id.match(/(.+)_confirmation/)[1]}:input")
if element[0]
Expand Down
11 changes: 11 additions & 0 deletions test/javascript/public/test/form_builders/validateForm.js
Expand Up @@ -125,3 +125,14 @@ asyncTest('Handle disable-with', 1, function() {
}, 60);
});

asyncTest('Disabled inputs do not stop form submission', 1, function() {
var form = $('form#new_user'), input = form.find('input#user_name');
var label = $('label[for="user_name"]');

input.disableClientSideValidations()
form.trigger('submit');
setTimeout(function() {
start();
ok($('iframe').contents().find('p:contains("Form submitted")')[0]);
}, 60);
});
15 changes: 10 additions & 5 deletions vendor/assets/javascripts/rails.validations.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 614c086

Please sign in to comment.