Chris@0: /** Chris@0: * @file Chris@0: * Simpletest behaviors. Chris@0: */ Chris@0: Chris@17: (function($, Drupal, drupalSettings) { Chris@0: /** Chris@0: * Collapses table rows followed by group rows on the test listing page. Chris@0: * Chris@0: * @type {Drupal~behavior} Chris@0: * Chris@0: * @prop {Drupal~behaviorAttach} attach Chris@0: * Attach collapse behavior on the test listing page. Chris@0: */ Chris@0: Drupal.behaviors.simpleTestGroupCollapse = { Chris@0: attach(context) { Chris@17: $(context) Chris@17: .find('.simpletest-group') Chris@17: .once('simpletest-group-collapse') Chris@17: .each(function() { Chris@17: const $group = $(this); Chris@17: const $image = $group.find('.simpletest-image'); Chris@17: $image.html(drupalSettings.simpleTest.images[0]).on('click', () => { Chris@0: const $tests = $group.nextUntil('.simpletest-group'); Chris@0: const expand = !$group.hasClass('expanded'); Chris@0: $group.toggleClass('expanded', expand); Chris@0: $tests.toggleClass('js-hide', !expand); Chris@0: $image.html(drupalSettings.simpleTest.images[+expand]); Chris@0: }); Chris@17: }); Chris@0: }, Chris@0: }; Chris@0: Chris@0: /** Chris@0: * Toggles test checkboxes to match the group checkbox. Chris@0: * Chris@0: * @type {Drupal~behavior} Chris@0: * Chris@0: * @prop {Drupal~behaviorAttach} attach Chris@0: * Attaches behavior for selecting all tests in a group. Chris@0: */ Chris@0: Drupal.behaviors.simpleTestSelectAll = { Chris@0: attach(context) { Chris@17: $(context) Chris@17: .find('.simpletest-group') Chris@17: .once('simpletest-group-select-all') Chris@17: .each(function() { Chris@17: const $group = $(this); Chris@17: const $cell = $group.find('.simpletest-group-select-all'); Chris@17: const $groupCheckbox = $( Chris@17: ``, Chris@17: ); Chris@17: const $testCheckboxes = $group Chris@17: .nextUntil('.simpletest-group') Chris@17: .find('input[type=checkbox]'); Chris@17: $cell.append($groupCheckbox); Chris@0: Chris@17: // Toggle the test checkboxes when the group checkbox is toggled. Chris@17: $groupCheckbox.on('change', function() { Chris@17: const checked = $(this).prop('checked'); Chris@17: $testCheckboxes.prop('checked', checked); Chris@17: }); Chris@17: Chris@17: // Update the group checkbox when a test checkbox is toggled. Chris@17: function updateGroupCheckbox() { Chris@17: let allChecked = true; Chris@17: $testCheckboxes.each(function() { Chris@17: if (!$(this).prop('checked')) { Chris@17: allChecked = false; Chris@17: return false; Chris@17: } Chris@17: }); Chris@17: $groupCheckbox.prop('checked', allChecked); Chris@17: } Chris@17: Chris@17: $testCheckboxes.on('change', updateGroupCheckbox); Chris@0: }); Chris@0: }, Chris@0: }; Chris@0: Chris@0: /** Chris@0: * Filters the test list table by a text input search string. Chris@0: * Chris@0: * Text search input: input.table-filter-text Chris@0: * Target table: input.table-filter-text[data-table] Chris@0: * Source text: .table-filter-text-source Chris@0: * Chris@0: * @type {Drupal~behavior} Chris@0: * Chris@0: * @prop {Drupal~behaviorAttach} attach Chris@0: * Attaches the filter behavior to the text input element. Chris@0: */ Chris@0: Drupal.behaviors.simpletestTableFilterByText = { Chris@0: attach(context) { Chris@0: const $input = $('input.table-filter-text').once('table-filter-text'); Chris@0: const $table = $($input.attr('data-table')); Chris@0: let $rows; Chris@0: let searched = false; Chris@0: Chris@0: function filterTestList(e) { Chris@17: const query = $(e.target) Chris@17: .val() Chris@17: .toLowerCase(); Chris@0: Chris@0: function showTestRow(index, row) { Chris@0: const $row = $(row); Chris@0: const $sources = $row.find('.table-filter-text-source'); Chris@17: const textMatch = Chris@17: $sources Chris@17: .text() Chris@17: .toLowerCase() Chris@17: .indexOf(query) !== -1; Chris@0: $row.closest('tr').toggle(textMatch); Chris@0: } Chris@0: Chris@0: // Filter if the length of the query is at least 3 characters. Chris@0: if (query.length >= 3) { Chris@0: // Indicate that a search has been performed, and hide the Chris@0: // "select all" checkbox. Chris@0: searched = true; Chris@0: $('#simpletest-form-table thead th.select-all input').hide(); Chris@0: Chris@0: $rows.each(showTestRow); Chris@0: } Chris@0: // Restore to the original state if any searching has occurred. Chris@0: else if (searched) { Chris@0: searched = false; Chris@0: $('#simpletest-form-table thead th.select-all input').show(); Chris@0: // Restore all rows to their original display state. Chris@0: $rows.css('display', ''); Chris@0: } Chris@0: } Chris@0: Chris@0: if ($table.length) { Chris@0: $rows = $table.find('tbody tr'); Chris@17: $input Chris@17: .trigger('focus') Chris@17: .on('keyup', Drupal.debounce(filterTestList, 200)); Chris@0: } Chris@0: }, Chris@0: }; Chris@17: })(jQuery, Drupal, drupalSettings);