|
88 | 88 | }
|
89 | 89 | return values;
|
90 | 90 |
|
91 |
| - } else if (elem.name && elem.name.match(/\[\]$/)) { // multiple elements [] |
| 91 | + } else if (elem.name && elem.name.substr(-2) === '[]') { // multiple elements [] |
92 | 92 | elements = elem.form.elements[elem.name].tagName ? [elem] : elem.form.elements[elem.name];
|
93 | 93 | values = [];
|
94 | 94 |
|
|
665 | 665 | };
|
666 | 666 |
|
667 | 667 |
|
| 668 | + /** |
| 669 | + * Compact checkboxes |
| 670 | + */ |
| 671 | + Nette.compactCheckboxes = function(form) { |
| 672 | + var name, i, elem, values = {}; |
| 673 | + |
| 674 | + for (i = 0; i < form.elements.length; i++) { |
| 675 | + elem = form.elements[i]; |
| 676 | + if (elem.tagName |
| 677 | + && elem.tagName.toLowerCase() === 'input' |
| 678 | + && elem.type === 'checkbox' |
| 679 | + ) { |
| 680 | + if (elem.name |
| 681 | + && elem.name.substr(-2) === '[]' |
| 682 | + ) { |
| 683 | + name = elem.name.substr(0, elem.name.length - 2); |
| 684 | + elem.removeAttribute('name'); |
| 685 | + elem.setAttribute('data-nette-name', name); |
| 686 | + } |
| 687 | + |
| 688 | + if (name = elem.getAttribute('data-nette-name')) { // eslint-disable-line no-cond-assign |
| 689 | + values[name] = values[name] || []; |
| 690 | + if (elem.checked && !elem.disabled) { |
| 691 | + values[name].push(elem.value); |
| 692 | + } |
| 693 | + } |
| 694 | + } |
| 695 | + } |
| 696 | + |
| 697 | + for (name in values) { |
| 698 | + if (form.elements[name] === undefined) { |
| 699 | + elem = document.createElement('input'); |
| 700 | + elem.setAttribute('name', name); |
| 701 | + elem.setAttribute('type', 'hidden'); |
| 702 | + form.appendChild(elem); |
| 703 | + } |
| 704 | + form.elements[name].value = values[name].join(','); |
| 705 | + } |
| 706 | + }; |
| 707 | + |
| 708 | + |
668 | 709 | /**
|
669 | 710 | * Setup handlers.
|
670 | 711 | */
|
671 | 712 | Nette.initForm = function(form) {
|
| 713 | + if (form.method === 'get' && form.hasAttribute('data-nette-compact')) { |
| 714 | + form.addEventListener('submit', function() { |
| 715 | + Nette.compactCheckboxes(form); |
| 716 | + }); |
| 717 | + } |
| 718 | + |
| 719 | + check: { |
| 720 | + for (var i = 0; i < form.elements.length; i++) { |
| 721 | + if (form.elements[i].getAttribute('data-nette-rules')) { |
| 722 | + break check; |
| 723 | + } |
| 724 | + } |
| 725 | + return; |
| 726 | + } |
| 727 | + |
672 | 728 | Nette.toggleForm(form);
|
673 | 729 |
|
674 | 730 | if (form.noValidate) {
|
675 | 731 | return;
|
676 | 732 | }
|
677 |
| - |
678 | 733 | form.noValidate = true;
|
679 | 734 |
|
680 | 735 | form.addEventListener('submit', function(e) {
|
|
692 | 747 | Nette.initOnLoad = function() {
|
693 | 748 | Nette.onDocumentReady(function() {
|
694 | 749 | for (var i = 0; i < document.forms.length; i++) {
|
695 |
| - var form = document.forms[i]; |
696 |
| - for (var j = 0; j < form.elements.length; j++) { |
697 |
| - if (form.elements[j].getAttribute('data-nette-rules')) { |
698 |
| - Nette.initForm(form); |
699 |
| - break; |
700 |
| - } |
701 |
| - } |
| 750 | + Nette.initForm(document.forms[i]); |
702 | 751 | }
|
703 | 752 |
|
704 | 753 | document.body.addEventListener('click', function(e) {
|
|
0 commit comments