|
5 | 5 | * Copyright (c) 2004 David Grudl (https://davidgrudl.com) |
6 | 6 | */ |
7 | 7 |
|
| 8 | +/** |
| 9 | + * @typedef {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement|HTMLButtonElement} FormElement |
| 10 | + * @typedef {{op: string, neg: boolean, msg: string, arg: *, rules: ?Array<Rule>, control: string, toggle: ?Array<string>}} Rule |
| 11 | + */ |
| 12 | + |
8 | 13 | (function (global, factory) { |
9 | 14 | if (!global.JSON) { |
10 | 15 | return; |
|
49 | 54 |
|
50 | 55 | /** |
51 | 56 | * Returns the value of form element. |
| 57 | + * @param {FormElement|RadioNodeList} elem |
| 58 | + * @return {*} |
52 | 59 | */ |
53 | 60 | Nette.getValue = function (elem) { |
54 | 61 | if (!elem) { |
55 | 62 | return null; |
56 | 63 |
|
57 | | - } else if (!elem.tagName) { // RadioNodeList, HTMLCollection, array |
| 64 | + } else if (!elem.tagName) { // RadioNodeList |
58 | 65 | return elem[0] ? Nette.getValue(elem[0]) : null; |
59 | 66 |
|
60 | 67 | } else if (elem.type === 'radio') { |
|
110 | 117 |
|
111 | 118 | /** |
112 | 119 | * Returns the effective value of form element. |
| 120 | + * @param {FormElement|RadioNodeList} elem |
| 121 | + * @param {boolean} filter |
| 122 | + * @return {*} |
113 | 123 | */ |
114 | 124 | Nette.getEffectiveValue = function (elem, filter) { |
115 | 125 | let val = Nette.getValue(elem); |
|
131 | 141 |
|
132 | 142 | /** |
133 | 143 | * Validates form element against given rules. |
| 144 | + * @param {FormElement|RadioNodeList} elem |
| 145 | + * @param {?Array<Rule>} rules |
| 146 | + * @param {boolean} onlyCheck |
| 147 | + * @param {?{value: *}} value |
| 148 | + * @param {?boolean} emptyOptional |
| 149 | + * @return {boolean} |
134 | 150 | */ |
135 | 151 | Nette.validateControl = function (elem, rules, onlyCheck, value, emptyOptional) { |
136 | 152 | elem = elem.tagName ? elem : elem[0]; // RadioNodeList |
|
188 | 204 |
|
189 | 205 | /** |
190 | 206 | * Validates whole form. |
| 207 | + * @param {HTMLFormElement} sender |
| 208 | + * @param {boolean} onlyCheck |
| 209 | + * @return {boolean} |
191 | 210 | */ |
192 | 211 | Nette.validateForm = function (sender, onlyCheck) { |
193 | 212 | let form = sender.form || sender, |
|
242 | 261 |
|
243 | 262 | /** |
244 | 263 | * Check if input is disabled. |
| 264 | + * @param {FormElement} elem |
| 265 | + * @return {boolean} |
245 | 266 | */ |
246 | 267 | Nette.isDisabled = function (elem) { |
247 | 268 | if (elem.type === 'radio') { |
|
258 | 279 |
|
259 | 280 | /** |
260 | 281 | * Adds error message to the queue. |
| 282 | + * @param {FormElement} elem |
| 283 | + * @param {string} message |
261 | 284 | */ |
262 | 285 | Nette.addError = function (elem, message) { |
263 | 286 | Nette.formErrors.push({ |
|
269 | 292 |
|
270 | 293 | /** |
271 | 294 | * Display error messages. |
| 295 | + * @param {HTMLFormElement} form |
| 296 | + * @param {Array<{element: FormElement, message: string}>} errors |
272 | 297 | */ |
273 | 298 | Nette.showFormErrors = function (form, errors) { |
274 | 299 | let messages = [], |
|
299 | 324 |
|
300 | 325 | /** |
301 | 326 | * Display modal window. |
| 327 | + * @param {string} message |
| 328 | + * @param {function} onclose |
302 | 329 | */ |
303 | 330 | Nette.showModal = function (message, onclose) { |
304 | 331 | let dialog = document.createElement('dialog'); |
|
329 | 356 |
|
330 | 357 | /** |
331 | 358 | * Validates single rule. |
| 359 | + * @param {FormElement|RadioNodeList} elem |
| 360 | + * @param {string} op |
| 361 | + * @param {*} arg |
| 362 | + * @param {?{value: *}} value |
332 | 363 | */ |
333 | 364 | Nette.validateRule = function (elem, op, arg, value) { |
334 | 365 | if (elem.validity && elem.validity.badInput) { |
|
562 | 593 |
|
563 | 594 | /** |
564 | 595 | * Process all toggles in form. |
| 596 | + * @param {HTMLFormElement} form |
| 597 | + * @param {?Event} event |
565 | 598 | */ |
566 | 599 | Nette.toggleForm = function (form, event) { |
567 | 600 | formToggles = {}; |
|
579 | 612 |
|
580 | 613 | /** |
581 | 614 | * Process toggles on form element. |
| 615 | + * @param {FormElement} elem |
| 616 | + * @param {?Array<Rule>} rules |
| 617 | + * @param {?boolean} success |
| 618 | + * @param {boolean} firsttime |
| 619 | + * @param {?{value: *}} value |
| 620 | + * @param {?boolean} emptyOptional |
| 621 | + * @return {boolean} |
582 | 622 | */ |
583 | 623 | Nette.toggleControl = function (elem, rules, success, firsttime, value, emptyOptional) { |
584 | 624 | rules = rules || JSON.parse(elem.getAttribute('data-nette-rules') || '[]'); |
|
643 | 683 |
|
644 | 684 | /** |
645 | 685 | * Displays or hides HTML element. |
| 686 | + * @param {string} selector |
| 687 | + * @param {boolean} visible |
| 688 | + * @param {FormElement} srcElement |
| 689 | + * @param {Event} event |
646 | 690 | */ |
647 | 691 | Nette.toggle = function (selector, visible, srcElement, event) { // eslint-disable-line no-unused-vars |
648 | 692 | if (/^\w[\w.:-]*$/.test(selector)) { // id |
|
657 | 701 |
|
658 | 702 | /** |
659 | 703 | * Compact checkboxes |
| 704 | + * @param {HTMLFormElement} form |
660 | 705 | */ |
661 | 706 | Nette.compactCheckboxes = function (form) { |
662 | 707 | let values = {}; |
|
700 | 745 |
|
701 | 746 | /** |
702 | 747 | * Setup handlers. |
| 748 | + * @param {HTMLFormElement} form |
703 | 749 | */ |
704 | 750 | Nette.initForm = function (form) { |
705 | 751 | if (form.method === 'get' && form.hasAttribute('data-nette-compact')) { |
|
760 | 806 |
|
761 | 807 | /** |
762 | 808 | * Converts string to web safe characters [a-z0-9-] text. |
| 809 | + * @param {string} s |
| 810 | + * @return {string} |
763 | 811 | */ |
764 | 812 | Nette.webalize = function (s) { |
765 | 813 | s = s.toLowerCase(); |
|
0 commit comments