diff -u b/core/modules/user/src/Form/UserPermissionsForm.php b/core/modules/user/src/Form/UserPermissionsForm.php --- b/core/modules/user/src/Form/UserPermissionsForm.php +++ b/core/modules/user/src/Form/UserPermissionsForm.php @@ -118,14 +118,14 @@ $form['filters']['text'] = [ '#type' => 'search', - '#title' => $this->t('Search'), + '#title' => $this->t('Filter permissions'), '#size' => 30, - '#placeholder' => $this->t('Enter permission name'), + '#placeholder' => $this->t('Filter by name'), + '#description' => $this->t('Enter a part of the permission name'), '#attributes' => [ 'class' => ['table-filter-text'], 'data-table' => '#permissions', 'autocomplete' => 'off', - 'title' => $this->t('Enter a part of the permission name to filter by.'), ], ]; diff -u b/core/modules/user/user.permissions.js b/core/modules/user/user.permissions.js --- b/core/modules/user/user.permissions.js +++ b/core/modules/user/user.permissions.js @@ -33,7 +33,9 @@ var $input = $('input.table-filter-text').once('table-filter-text'); var $table = $($input.attr('data-table')); - var $rowsAndDetails, $rows, $details; + var $rowsAndDetails = void 0; + var $rows = void 0; + var $details = void 0; var searching = false; function filterPermissionList(e) { @@ -45,31 +47,21 @@ var textMatch = $sources.text().toLowerCase().indexOf(query) !== -1; $row.closest('tr').toggle(textMatch); } - // Search over all rows and packages. + $rowsAndDetails.show(); - // Filter if the length of the query is at least 2 characters. if (query.length >= 2) { searching = true; $rows.each(showPermissionRow); - // Note that we first open all
to be able to use ':visible'. - // Mark the
elements that were closed before filtering, so - // they can be reclosed when filtering is removed. $details.not('[open]').attr('data-drupal-system-state', 'forced-open'); - // Hide the package
if they don't have any visible rows. - // Note that we first show() all
to be able to use ':visible'. $details.attr('open', true).each(hidePackageDetails); - } - else if (searching) { + } else if (searching) { searching = false; $rowsAndDetails.show(); - // Return
elements that had been closed before filtering - // to a closed state. - $details.filter('[data-drupal-system-state="forced-open"]') - .removeAttr('data-drupal-system-state') - .attr('open', false); + + $details.filter('[data-drupal-system-state="forced-open"]').removeAttr('data-drupal-system-state').attr('open', false); } } @@ -95 +87 @@ -})(jQuery, Drupal); +})(jQuery, Drupal); \ No newline at end of file only in patch2: unchanged: --- a/core/modules/user/user.permissions.es6.js +++ b/core/modules/user/user.permissions.es6.js @@ -68,6 +68,65 @@ // Re-insert the table into the DOM. $ancestor[method]($table); }); + + const $input = $('input.table-filter-text').once('table-filter-text'); + const $table = $($input.attr('data-table')); + let $rowsAndDetails; + let $rows; + let $details; + let searching = false; + + function filterPermissionList(e) { + const query = $(e.target) + .val() + .toLowerCase(); + + function showPermissionRow(index, row) { + const $row = $(row); + const $sources = $row.find('.table-filter-text-source'); + const textMatch = + $sources + .text() + .toLowerCase() + .indexOf(query) !== -1; + $row.closest('tr').toggle(textMatch); + } + // Search over all rows and packages. + $rowsAndDetails.show(); + + // Filter if the length of the query is at least 2 characters. + if (query.length >= 2) { + searching = true; + $rows.each(showPermissionRow); + + // Note that we first open all
to be able to use ':visible'. + // Mark the
elements that were closed before filtering, so + // they can be closed again when filtering is removed. + $details + .not('[open]') + .attr('data-drupal-system-state', 'forced-open'); + + // Hide the package
if they don't have any visible rows. + // Note that we first show() all
to be able to use ':visible'. + $details.attr('open', true).each(hidePackageDetails); + } else if (searching) { + searching = false; + $rowsAndDetails.show(); + // Return
elements that had been closed before filtering + // to a closed state. + $details + .filter('[data-drupal-system-state="forced-open"]') + .removeAttr('data-drupal-system-state') + .attr('open', false); + } + } + + if ($table.length) { + $rowsAndDetails = $table.find('tr, details'); + $rows = $table.find('tbody tr'); + $details = $rowsAndDetails.filter('.package-listing'); + $input.on('keyup', filterPermissionList); + } }, /**