Skip to content
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
23 changes: 17 additions & 6 deletions src/htmx.js
Original file line number Diff line number Diff line change
Expand Up @@ -2502,12 +2502,19 @@ return (function () {
return false;
}

function shouldInclude(elt) {
if(elt.name === "" || elt.name == null || elt.disabled || closest(elt, "fieldset[disabled]")) {
function couldInclude(elt) {
if (elt.name === '' || elt.name == null || elt.disabled || closest(elt, 'fieldset[disabled]')) {
return false;
}
// ignore "submitter" types (see jQuery src/serialize.js)
if (elt.type === "button" || elt.type === "submit" || elt.tagName === "image" || elt.tagName === "reset" || elt.tagName === "file" ) {
if (elt.type === 'button' || elt.type === 'submit' || elt.tagName === 'image' || elt.tagName === 'reset' || elt.tagName === 'file') {
return false;
}
return true;
}

function shouldInclude(elt) {
if (!couldInclude(elt)) {
return false;
}
if (elt.type === "checkbox" || elt.type === "radio" ) {
Expand All @@ -2516,6 +2523,10 @@ return (function () {
return true;
}

function shouldValidate(elt) {
return couldInclude(elt);
}

function addValueToValues(name, value, values) {
// This is a little ugly because both the current value of the named value in the form
// and the new value could be arrays, so we have to handle all four cases :/
Expand Down Expand Up @@ -2556,9 +2567,9 @@ return (function () {
value = toArray(elt.files);
}
addValueToValues(name, value, values);
if (validate) {
validateElement(elt, errors);
}
}
if (validate && shouldValidate(elt)) {
validateElement(elt, errors);
}
if (matches(elt, 'form')) {
var inputs = elt.elements;
Expand Down
29 changes: 29 additions & 0 deletions test/core/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,35 @@ describe("Core htmx AJAX Tests", function(){

});

it('properly handles radio inputs', function()
{
var values;
this.server.respondWith('Post', '/test', function(xhr) {
values = getParameters(xhr)
xhr.respond(204, {}, '')
});

var form = make('<form hx-post="/test" hx-trigger="click">' +
'<div role="radiogroup">' +
'<input id="rb1" name="r1" value="rb1" type="radio">' +
'<input id="rb2" name="r1" value="rb2" type="radio">' +
'<input id="rb3" name="r1" value="rb3" type="radio">' +
'<input id="rb4" name="r2" value="rb4" type="radio">' +
'<input id="rb5" name="r2" value="rb5" type="radio">' +
'<input id="rb6" name="r3" value="rb6" type="radio">' +
'</div>' +
'</form>');

form.click();
this.server.respond();
values.should.deep.equal({});

byId('rb1').checked = true;
form.click();
this.server.respond();
values.should.deep.equal({ r1: 'rb1' });
});

it('text nodes dont screw up settling via variable capture', function()
{
this.server.respondWith("GET", "/test", "<div id='d1' hx-trigger='click consume' hx-get='/test2'></div>fooo");
Expand Down
36 changes: 36 additions & 0 deletions test/core/validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,42 @@ describe("Core htmx client side validation tests", function(){
form.textContent.should.equal("Clicked!");
});

it('Custom validation error prevents request for unticked checkboxes', function() {
this.server.respondWith('POST', '/test', 'Clicked!');

var form = make('<form hx-post="/test" hx-trigger="click">' +
'No Request' +
'<input id="i1" name="i1" type="checkbox">' +
'</form>');
byId('i1').setCustomValidity('Nope');
form.textContent.should.equal('No Request');
form.click();
this.server.respond();
form.textContent.should.equal('No Request');
byId('i1').setCustomValidity('');
form.click();
this.server.respond();
form.textContent.should.equal('Clicked!');
});

it('Custom validation error prevents request for unselected radiogroups', function() {
this.server.respondWith('POST', '/test', 'Clicked!');

var form = make('<form hx-post="/test" hx-trigger="click">' +
'No Request' +
'<input id="i1" name="i1" type="radio">' +
'</form>');
byId('i1').setCustomValidity('Nope');
form.textContent.should.equal('No Request');
form.click();
this.server.respond();
form.textContent.should.equal('No Request');
byId('i1').setCustomValidity('');
form.click();
this.server.respond();
form.textContent.should.equal('Clicked!');
});

it('hyperscript validation error prevents request', function()
{
if (IsIE11()) {
Expand Down