Skip to content

Commit 2614e13

Browse files
committed
netteForms: reimplemented compact transmission mode via formdata event
the previous solution broke validation because it deleted the attribute name
1 parent fcd6e1f commit 2614e13

File tree

1 file changed

+9
-31
lines changed

1 file changed

+9
-31
lines changed

src/assets/netteForms.js

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -690,43 +690,21 @@
690690
/**
691691
* Compact checkboxes
692692
* @param {HTMLFormElement} form
693+
* @param {FormData} formData
693694
*/
694-
Nette.compactCheckboxes = function (form) {
695+
Nette.compactCheckboxes = function (form, formData) {
695696
let values = {};
696697

697-
for (let i = 0; i < form.elements.length; i++) {
698-
let elem = form.elements[i];
699-
if (elem.tagName
700-
&& elem.tagName.toLowerCase() === 'input'
701-
&& elem.type === 'checkbox'
702-
) {
703-
let name = elem.getAttribute('data-nette-name');
704-
if (elem.name
705-
&& elem.name.endsWith('[]')
706-
) {
707-
name = elem.name.substring(0, elem.name.length - 2);
708-
elem.removeAttribute('name');
709-
elem.setAttribute('data-nette-name', name);
710-
}
711-
712-
if (name) {
713-
values[name] = values[name] || [];
714-
if (elem.checked && !elem.disabled) {
715-
values[name].push(elem.value);
716-
}
717-
}
698+
for (let elem of form.elements) {
699+
if (elem instanceof HTMLInputElement && elem.type === 'checkbox' && elem.name.endsWith('[]') && elem.checked && !elem.disabled) {
700+
formData.delete(elem.name);
701+
values[elem.name] ??= [];
702+
values[elem.name].push(elem.value);
718703
}
719704
}
720705

721706
for (let name in values) {
722-
if (form.elements[name] === undefined) {
723-
let elem = document.createElement('input');
724-
elem.setAttribute('name', name);
725-
elem.setAttribute('type', 'hidden');
726-
form.append(elem);
727-
}
728-
form.elements[name].value = values[name].join(',');
729-
form.elements[name].disabled = values[name].length === 0;
707+
formData.set(name.substring(0, name.length - 2), values[name].join(','));
730708
}
731709
};
732710

@@ -737,7 +715,7 @@
737715
*/
738716
Nette.initForm = function (form) {
739717
if (form.method === 'get' && form.hasAttribute('data-nette-compact')) {
740-
form.addEventListener('submit', () => Nette.compactCheckboxes(form));
718+
form.addEventListener('formdata', (e) => Nette.compactCheckboxes(form, e.formData));
741719
}
742720

743721
check: {

0 commit comments

Comments
 (0)