Skip to content

Commit 90f1e98

Browse files
committed
netteForms: narrowing of parameter types of some methods
1 parent 240af68 commit 90f1e98

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

src/assets/netteForms.js

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@
3939
Nette.version = '3.3.0';
4040

4141

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+
4253
/**
4354
* Function to execute when the DOM is fully loaded.
4455
* @private
@@ -117,16 +128,14 @@
117128

118129
/**
119130
* Returns the effective value of form element.
120-
* @param {FormElement|RadioNodeList} elem
131+
* @param {FormElement} elem
121132
* @param {boolean} filter
122133
* @return {*}
123134
*/
124135
Nette.getEffectiveValue = function (elem, filter) {
125136
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 = '';
130139
}
131140
if (filter && preventFiltering[elem.name] === undefined) {
132141
preventFiltering[elem.name] = true;
@@ -141,23 +150,22 @@
141150

142151
/**
143152
* Validates form element against given rules.
144-
* @param {FormElement|RadioNodeList} elem
153+
* @param {FormElement} elem
145154
* @param {?Array<Rule>} rules
146155
* @param {boolean} onlyCheck
147156
* @param {?{value: *}} value
148157
* @param {?boolean} emptyOptional
149158
* @return {boolean}
150159
*/
151160
Nette.validateControl = function (elem, rules, onlyCheck, value, emptyOptional) {
152-
elem = elem.tagName ? elem : elem[0]; // RadioNodeList
153161
rules = rules || JSON.parse(elem.getAttribute('data-nette-rules') || '[]');
154162
value = value === undefined ? {value: Nette.getEffectiveValue(elem)} : value;
155163
emptyOptional = emptyOptional === undefined ? !Nette.validateRule(elem, ':filled', null, value) : emptyOptional;
156164

157165
for (let id = 0, len = rules.length; id < len; id++) {
158166
let rule = rules[id],
159167
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;
161169

162170
rule.neg = op[1];
163171
rule.op = op[2];
@@ -169,9 +177,7 @@
169177
continue;
170178
}
171179

172-
curElem = curElem.tagName ? curElem : curElem[0]; // RadioNodeList
173180
let success = Nette.validateRule(curElem, rule.op, rule.arg, elem === curElem ? value : undefined);
174-
175181
if (success === null) {
176182
continue;
177183
} else if (rule.neg) {
@@ -356,13 +362,13 @@
356362

357363
/**
358364
* Validates single rule.
359-
* @param {FormElement|RadioNodeList} elem
365+
* @param {FormElement} elem
360366
* @param {string} op
361367
* @param {*} arg
362368
* @param {?{value: *}} value
363369
*/
364370
Nette.validateRule = function (elem, op, arg, value) {
365-
if (elem.validity && elem.validity.badInput) {
371+
if (elem.validity.badInput) {
366372
return op === ':filled';
367373
}
368374

@@ -377,7 +383,7 @@
377383
let arr = Array.isArray(arg) ? arg.slice(0) : [arg];
378384
for (let i = 0, len = arr.length; i < len; i++) {
379385
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);
381387
arr[i] = control === elem ? value.value : Nette.getEffectiveValue(control, true);
382388
}
383389
}
@@ -632,7 +638,7 @@
632638
for (let id = 0, len = rules.length; id < len; id++) {
633639
let rule = rules[id],
634640
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;
636642

637643
rule.neg = op[1];
638644
rule.op = op[2];
@@ -661,11 +667,9 @@
661667
if ((rule.condition && Nette.toggleControl(elem, rule.rules, curSuccess, firsttime, value, rule.op === ':blank' ? false : emptyOptional)) || rule.toggle) {
662668
has = true;
663669
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;
667671
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])) {
669673
els[i].addEventListener('change', handler);
670674
toggleListeners.set(els[i], null);
671675
}

tests/netteForms/spec/Nette.validateRuleSpec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ describe('Nette.getValue & validateRule', () => {
209209
</form>`;
210210

211211
let form = testContainer.querySelector('form'),
212-
el = form['input[]'];
212+
el = form['input[]'][0];
213213

214214
expect(Nette.getValue(el)).toEqual([]);
215215
expect(Nette.validateRule(el, 'filled')).toBe(false);
@@ -290,7 +290,7 @@ describe('Nette.getValue & validateRule', () => {
290290
</form>`;
291291

292292
let form = testContainer.querySelector('form'),
293-
el = form.input;
293+
el = form.input[0];
294294

295295
expect(Nette.getValue(el)).toBe(null);
296296
expect(Nette.validateRule(el, 'filled')).toBe(false);

0 commit comments

Comments
 (0)