Skip to content

Commit 75beaa0

Browse files
committed
netteForms: refactoring, added expandRadioElement()
1 parent 90f1e98 commit 75beaa0

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

src/assets/netteForms.js

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@
5050
}
5151

5252

53+
/**
54+
* @param {FormElement} elem
55+
* @return {Array<FormElement>}
56+
*/
57+
function expandRadioElement(elem) {
58+
let res = elem.form.elements.namedItem(elem.name);
59+
return res instanceof RadioNodeList ? Array.from(res) : [res];
60+
}
61+
62+
5363
/**
5464
* Function to execute when the DOM is fully loaded.
5565
* @private
@@ -76,13 +86,9 @@
7686
return elem[0] ? Nette.getValue(elem[0]) : null;
7787

7888
} else if (elem.type === 'radio') {
79-
let elements = elem.form.elements; // prevents problem with name 'item' or 'namedItem'
80-
for (let i = 0; i < elements.length; i++) {
81-
if (elements[i].name === elem.name && elements[i].checked) {
82-
return elements[i].value;
83-
}
84-
}
85-
return null;
89+
return expandRadioElement(elem)
90+
.find((input) => input.checked)
91+
?.value ?? null;
8692

8793
} else if (elem.type === 'file') {
8894
return elem.files || elem.value;
@@ -104,15 +110,9 @@
104110
return values;
105111

106112
} else if (elem.name && elem.name.endsWith('[]')) { // multiple elements []
107-
let elements = elem.form.elements[elem.name].tagName ? [elem] : elem.form.elements[elem.name],
108-
values = [];
109-
110-
for (let i = 0; i < elements.length; i++) {
111-
if (elements[i].type !== 'checkbox' || elements[i].checked) {
112-
values.push(elements[i].value);
113-
}
114-
}
115-
return values;
113+
return expandRadioElement(elem)
114+
.filter((input) => input.checked)
115+
.map((input) => input.value);
116116

117117
} else if (elem.type === 'checkbox') {
118118
return elem.checked;
@@ -272,12 +272,8 @@
272272
*/
273273
Nette.isDisabled = function (elem) {
274274
if (elem.type === 'radio') {
275-
for (let i = 0, elements = elem.form.elements; i < elements.length; i++) {
276-
if (elements[i].name === elem.name && !elements[i].disabled) {
277-
return false;
278-
}
279-
}
280-
return true;
275+
return expandRadioElement(elem)
276+
.every((input) => input.disabled);
281277
}
282278
return elem.disabled;
283279
};
@@ -667,13 +663,12 @@
667663
if ((rule.condition && Nette.toggleControl(elem, rule.rules, curSuccess, firsttime, value, rule.op === ':blank' ? false : emptyOptional)) || rule.toggle) {
668664
has = true;
669665
if (firsttime) {
670-
let els = elem.form.elements;
671-
for (let i = 0; i < els.length; i++) {
672-
if (els[i].name === curElem.name && !toggleListeners.has(els[i])) {
673-
els[i].addEventListener('change', handler);
674-
toggleListeners.set(els[i], null);
675-
}
676-
}
666+
expandRadioElement(curElem)
667+
.filter((el) => !toggleListeners.has(el))
668+
.forEach((el) => {
669+
el.addEventListener('change', handler);
670+
toggleListeners.set(el, null);
671+
});
677672
}
678673
for (let toggleId in rule.toggle || []) {
679674
formToggles[toggleId] = formToggles[toggleId] || {elem: elem};

0 commit comments

Comments
 (0)