|
39 | 39 | Nette.version = '3.3.0'; |
40 | 40 |
|
41 | 41 |
|
| 42 | + /** |
| 43 | + * @param {HTMLFormElement} form |
| 44 | + * @param {string} name |
| 45 | + * @return {?FormElement} |
| 46 | + */ |
| 47 | + function getFormElement(form, name) { |
| 48 | + let res = form.elements.namedItem(name); |
| 49 | + return res instanceof RadioNodeList ? res[0] : res; |
| 50 | + } |
| 51 | + |
| 52 | + |
42 | 53 | /** |
43 | 54 | * Function to execute when the DOM is fully loaded. |
44 | 55 | * @private |
|
117 | 128 |
|
118 | 129 | /** |
119 | 130 | * Returns the effective value of form element. |
120 | | - * @param {FormElement|RadioNodeList} elem |
| 131 | + * @param {FormElement} elem |
121 | 132 | * @param {boolean} filter |
122 | 133 | * @return {*} |
123 | 134 | */ |
124 | 135 | Nette.getEffectiveValue = function (elem, filter) { |
125 | 136 | let val = Nette.getValue(elem); |
126 | | - if (elem.getAttribute) { |
127 | | - if (val === elem.getAttribute('data-nette-empty-value')) { |
128 | | - val = ''; |
129 | | - } |
| 137 | + if (val === elem.getAttribute('data-nette-empty-value')) { |
| 138 | + val = ''; |
130 | 139 | } |
131 | 140 | if (filter && preventFiltering[elem.name] === undefined) { |
132 | 141 | preventFiltering[elem.name] = true; |
|
141 | 150 |
|
142 | 151 | /** |
143 | 152 | * Validates form element against given rules. |
144 | | - * @param {FormElement|RadioNodeList} elem |
| 153 | + * @param {FormElement} elem |
145 | 154 | * @param {?Array<Rule>} rules |
146 | 155 | * @param {boolean} onlyCheck |
147 | 156 | * @param {?{value: *}} value |
148 | 157 | * @param {?boolean} emptyOptional |
149 | 158 | * @return {boolean} |
150 | 159 | */ |
151 | 160 | Nette.validateControl = function (elem, rules, onlyCheck, value, emptyOptional) { |
152 | | - elem = elem.tagName ? elem : elem[0]; // RadioNodeList |
153 | 161 | rules = rules || JSON.parse(elem.getAttribute('data-nette-rules') || '[]'); |
154 | 162 | value = value === undefined ? {value: Nette.getEffectiveValue(elem)} : value; |
155 | 163 | emptyOptional = emptyOptional === undefined ? !Nette.validateRule(elem, ':filled', null, value) : emptyOptional; |
156 | 164 |
|
157 | 165 | for (let id = 0, len = rules.length; id < len; id++) { |
158 | 166 | let rule = rules[id], |
159 | 167 | op = rule.op.match(/(~)?([^?]+)/), |
160 | | - curElem = rule.control ? elem.form.elements.namedItem(rule.control) : elem; |
| 168 | + curElem = rule.control ? getFormElement(elem.form, rule.control) : elem; |
161 | 169 |
|
162 | 170 | rule.neg = op[1]; |
163 | 171 | rule.op = op[2]; |
|
169 | 177 | continue; |
170 | 178 | } |
171 | 179 |
|
172 | | - curElem = curElem.tagName ? curElem : curElem[0]; // RadioNodeList |
173 | 180 | let success = Nette.validateRule(curElem, rule.op, rule.arg, elem === curElem ? value : undefined); |
174 | | - |
175 | 181 | if (success === null) { |
176 | 182 | continue; |
177 | 183 | } else if (rule.neg) { |
|
356 | 362 |
|
357 | 363 | /** |
358 | 364 | * Validates single rule. |
359 | | - * @param {FormElement|RadioNodeList} elem |
| 365 | + * @param {FormElement} elem |
360 | 366 | * @param {string} op |
361 | 367 | * @param {*} arg |
362 | 368 | * @param {?{value: *}} value |
363 | 369 | */ |
364 | 370 | Nette.validateRule = function (elem, op, arg, value) { |
365 | | - if (elem.validity && elem.validity.badInput) { |
| 371 | + if (elem.validity.badInput) { |
366 | 372 | return op === ':filled'; |
367 | 373 | } |
368 | 374 |
|
|
377 | 383 | let arr = Array.isArray(arg) ? arg.slice(0) : [arg]; |
378 | 384 | for (let i = 0, len = arr.length; i < len; i++) { |
379 | 385 | if (arr[i] && arr[i].control) { |
380 | | - let control = elem.form.elements.namedItem(arr[i].control); |
| 386 | + let control = getFormElement(elem.form, arr[i].control); |
381 | 387 | arr[i] = control === elem ? value.value : Nette.getEffectiveValue(control, true); |
382 | 388 | } |
383 | 389 | } |
|
632 | 638 | for (let id = 0, len = rules.length; id < len; id++) { |
633 | 639 | let rule = rules[id], |
634 | 640 | op = rule.op.match(/(~)?([^?]+)/), |
635 | | - curElem = rule.control ? elem.form.elements.namedItem(rule.control) : elem; |
| 641 | + curElem = rule.control ? getFormElement(elem.form, rule.control) : elem; |
636 | 642 |
|
637 | 643 | rule.neg = op[1]; |
638 | 644 | rule.op = op[2]; |
|
661 | 667 | if ((rule.condition && Nette.toggleControl(elem, rule.rules, curSuccess, firsttime, value, rule.op === ':blank' ? false : emptyOptional)) || rule.toggle) { |
662 | 668 | has = true; |
663 | 669 | if (firsttime) { |
664 | | - let name = curElem.tagName ? curElem.name : curElem[0].name, |
665 | | - els = curElem.tagName ? curElem.form.elements : curElem; |
666 | | - |
| 670 | + let els = elem.form.elements; |
667 | 671 | for (let i = 0; i < els.length; i++) { |
668 | | - if (els[i].name === name && !toggleListeners.has(els[i])) { |
| 672 | + if (els[i].name === curElem.name && !toggleListeners.has(els[i])) { |
669 | 673 | els[i].addEventListener('change', handler); |
670 | 674 | toggleListeners.set(els[i], null); |
671 | 675 | } |
|
0 commit comments