diff --git a/modules/simpletest/simpletest.js b/modules/simpletest/simpletest.js index a7af10d1b4c..efdc28366f7 100644 --- a/modules/simpletest/simpletest.js +++ b/modules/simpletest/simpletest.js @@ -61,36 +61,41 @@ Drupal.behaviors.simpleTestMenuCollapse = { Drupal.behaviors.simpleTestSelectAll = { attach: function() { $('td.simpletest-select-all').each(function() { - var checkboxes = Drupal.settings.simpleTest['simpletest-test-group-'+ $(this).attr('id')].testNames, totalCheckboxes = 0, - checkbox = $('').change(function() { + var testCheckboxes = Drupal.settings.simpleTest['simpletest-test-group-' + $(this).attr('id')].testNames; + var groupCheckbox = $(''); + + // Each time a single-test checkbox is checked or unchecked, make sure + // that the associated group checkbox gets the right state too. + var updateGroupCheckbox = function() { + var checkedTests = 0; + for (var i = 0; i < testCheckboxes.length; i++) { + $('#' + testCheckboxes[i]).each(function() { + if (($(this).attr('checked'))) { + checkedTests++; + } + }); + } + $(groupCheckbox).attr('checked', (checkedTests == testCheckboxes.length)); + } + + // Have the single-test checkboxes follow the group checkbox. + groupCheckbox.change(function() { var checked = !!($(this).attr('checked')); - for (var i = 0; i < checkboxes.length; i++) { - $('#'+ checkboxes[i]).attr('checked', checked); - } - self.data('simpletest-checked-tests', (checked ? checkboxes.length : 0)); - }).data('simpletest-checked-tests', 0); - var self = $(this); - for (var i = 0; i < checkboxes.length; i++) { - if ($('#' + checkboxes[i]).change(function() { - if (checkbox.attr('checked') == 'checked') { - checkbox.attr('checked', ''); - } - var data = (!self.data('simpletest-checked-tests') ? 0 : self.data('simpletest-checked-tests')) + (!!($(this).attr('checked')) ? 1 : -1); - self.data('simpletest-checked-tests', data); - if (data == checkboxes.length) { - checkbox.attr('checked', 'checked'); - } - else { - checkbox.removeAttr('checked'); - } - }).attr('checked') == 'checked') { - totalCheckboxes++; + for (var i = 0; i < testCheckboxes.length; i++) { + $('#'+ testCheckboxes[i]).attr('checked', checked); } + }); + + // Have the group checkbox follow the single-test checkboxes. + for (var i = 0; i < testCheckboxes.length; i++) { + $('#' + testCheckboxes[i]).change(function() { + updateGroupCheckbox(); + }); } - if (totalCheckboxes == checkboxes.length) { - $(checkbox).attr('checked', 'checked'); - } - $(this).append(checkbox); + + // Initialize status for the group checkbox correctly. + updateGroupCheckbox(); + $(this).append(groupCheckbox); }); } };