|
50 | 50 | } |
51 | 51 |
|
52 | 52 |
|
| 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 | + |
53 | 63 | /** |
54 | 64 | * Function to execute when the DOM is fully loaded. |
55 | 65 | * @private |
|
76 | 86 | return elem[0] ? Nette.getValue(elem[0]) : null; |
77 | 87 |
|
78 | 88 | } 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; |
86 | 92 |
|
87 | 93 | } else if (elem.type === 'file') { |
88 | 94 | return elem.files || elem.value; |
|
104 | 110 | return values; |
105 | 111 |
|
106 | 112 | } 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); |
116 | 116 |
|
117 | 117 | } else if (elem.type === 'checkbox') { |
118 | 118 | return elem.checked; |
|
272 | 272 | */ |
273 | 273 | Nette.isDisabled = function (elem) { |
274 | 274 | 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); |
281 | 277 | } |
282 | 278 | return elem.disabled; |
283 | 279 | }; |
|
667 | 663 | if ((rule.condition && Nette.toggleControl(elem, rule.rules, curSuccess, firsttime, value, rule.op === ':blank' ? false : emptyOptional)) || rule.toggle) { |
668 | 664 | has = true; |
669 | 665 | 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 | + }); |
677 | 672 | } |
678 | 673 | for (let toggleId in rule.toggle || []) { |
679 | 674 | formToggles[toggleId] = formToggles[toggleId] || {elem: elem}; |
|
0 commit comments