From 5ba45909d4ed1776c96788bcdc27e492dac03d11 Mon Sep 17 00:00:00 2001 From: Brian Canini <canini.16@osu.edu> Date: Thu, 26 Aug 2021 11:11:27 -0400 Subject: [PATCH] - Upgrading drupal/admin_toolbar (2.4.0 => 3.0.2) --- composer.json | 2 +- composer.lock | 19 ++- vendor/composer/InstalledVersions.php | 10 +- vendor/composer/installed.json | 19 ++- vendor/composer/installed.php | 10 +- web/modules/admin_toolbar/README.txt | 2 +- .../admin_toolbar/admin_toolbar.info.yml | 10 +- .../admin_toolbar/admin_toolbar.libraries.yml | 13 +- .../admin_toolbar/admin_toolbar.module | 9 + ...admin_toolbar_links_access_filter.info.yml | 6 +- .../admin_toolbar_links_access_filter.module | 33 +++- .../admin_toolbar_search.info.yml | 10 +- .../admin_toolbar_search.services.yml | 1 + .../css/admin.toolbar_search.css | 3 +- .../css/admin.toolbar_search.css.orig | 20 --- .../js/admin_toolbar_search.js | 4 +- .../js/admin_toolbar_search.js.orig | 134 --------------- .../admin_toolbar_search/src/SearchLinks.php | 154 +++++++++++------- .../AdminToolbarSearchTestBase.php | 6 +- .../AdminToolbarToolsSearchTest.php | 37 +++-- .../admin_toolbar_tools.info.yml | 9 +- .../admin_toolbar_tools.install | 20 +++ .../admin_toolbar_tools.links.menu.yml | 8 +- .../admin_toolbar_tools.routing.yml | 10 +- .../install/admin_toolbar_tools.settings.yml | 2 + .../schema/admin_toolbar_tools.schema.yml | 10 ++ .../admin_toolbar_tools/css/tools.css | 1 + .../src/Controller/ToolbarController.php | 2 +- .../Form/AdminToolbarToolsSettingsForm.php | 111 +++++++++++++ .../src/Plugin/Derivative/ExtraLinks.php | 76 +++++++-- .../src/Plugin/Menu/MenuLinkEntity.php | 107 ++++++++++++ .../Functional/AdminToolbarToolsAlterTest.php | 2 +- .../admin_toolbar/css/admin.toolbar.css | 36 ++-- .../css/admin.toolbar_search.css | 8 +- .../admin_toolbar/js/admin_toolbar.hover.js | 13 ++ .../js/admin_toolbar.hoverintent.js | 16 ++ web/modules/admin_toolbar/js/admin_toolbar.js | 13 -- .../src/Functional/AdminToolbarAlterTest.php | 2 +- .../Functional/AdminToolbarToolsSortTest.php | 108 +++++++----- 39 files changed, 665 insertions(+), 391 deletions(-) delete mode 100755 web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig delete mode 100755 web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php create mode 100644 web/modules/admin_toolbar/js/admin_toolbar.hover.js create mode 100644 web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js diff --git a/composer.json b/composer.json index 602e0bd9fb..77712c9658 100644 --- a/composer.json +++ b/composer.json @@ -87,7 +87,7 @@ "desandro/masonry": "4.2", "dimsemenov/magnific-popup": "1.1", "drupal/addtocalendar": "3.2", - "drupal/admin_toolbar": "2.4", + "drupal/admin_toolbar": "3.0.2", "drupal/administerusersbyrole": "3.0", "drupal/allowed_formats": "1.3", "drupal/anchor_link": "1.7", diff --git a/composer.lock b/composer.lock index 4f6452429b..6b02e6248d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "380fe9eca56285be5ea4b81288b6fd1f", + "content-hash": "d92afd65f29182ece4d6df27d3215b4d", "packages": [ { "name": "alchemy/zippy", @@ -1710,26 +1710,29 @@ }, { "name": "drupal/admin_toolbar", - "version": "2.4.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/admin_toolbar.git", - "reference": "8.x-2.4" + "reference": "3.0.2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.4.zip", - "reference": "8.x-2.4", - "shasum": "6240047b8d91ac78f98d861ba8282af971fa0b38" + "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.0.2.zip", + "reference": "3.0.2", + "shasum": "a3b7a8030695d0c1d49ec57786321e2dd142184a" }, "require": { "drupal/core": "^8.8.0 || ^9.0" }, + "require-dev": { + "drupal/admin_toolbar_tools": "*" + }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-2.4", - "datestamp": "1601999178", + "version": "3.0.2", + "datestamp": "1629907124", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index a7d4124c39..504e9a7f61 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -30,7 +30,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9', + 'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072', 'name' => 'osu-asc-webservices/d8-upstream', ), 'versions' => @@ -312,12 +312,12 @@ class InstalledVersions ), 'drupal/admin_toolbar' => array ( - 'pretty_version' => '2.4.0', - 'version' => '2.4.0.0', + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', 'aliases' => array ( ), - 'reference' => '8.x-2.4', + 'reference' => '3.0.2', ), 'drupal/administerusersbyrole' => array ( @@ -2226,7 +2226,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9', + 'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072', ), 'pantheon-systems/quicksilver-pushback' => array ( diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index f202a91f4f..143d5b3a7f 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1751,27 +1751,30 @@ }, { "name": "drupal/admin_toolbar", - "version": "2.4.0", - "version_normalized": "2.4.0.0", + "version": "3.0.2", + "version_normalized": "3.0.2.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/admin_toolbar.git", - "reference": "8.x-2.4" + "reference": "3.0.2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.4.zip", - "reference": "8.x-2.4", - "shasum": "6240047b8d91ac78f98d861ba8282af971fa0b38" + "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.0.2.zip", + "reference": "3.0.2", + "shasum": "a3b7a8030695d0c1d49ec57786321e2dd142184a" }, "require": { "drupal/core": "^8.8.0 || ^9.0" }, + "require-dev": { + "drupal/admin_toolbar_tools": "*" + }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-2.4", - "datestamp": "1601999178", + "version": "3.0.2", + "datestamp": "1629907124", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index a8a6cc6445..7028e1bb97 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -6,7 +6,7 @@ 'aliases' => array ( ), - 'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9', + 'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072', 'name' => 'osu-asc-webservices/d8-upstream', ), 'versions' => @@ -288,12 +288,12 @@ ), 'drupal/admin_toolbar' => array ( - 'pretty_version' => '2.4.0', - 'version' => '2.4.0.0', + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', 'aliases' => array ( ), - 'reference' => '8.x-2.4', + 'reference' => '3.0.2', ), 'drupal/administerusersbyrole' => array ( @@ -2202,7 +2202,7 @@ 'aliases' => array ( ), - 'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9', + 'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072', ), 'pantheon-systems/quicksilver-pushback' => array ( diff --git a/web/modules/admin_toolbar/README.txt b/web/modules/admin_toolbar/README.txt index 46c2929a6f..110c238e28 100755 --- a/web/modules/admin_toolbar/README.txt +++ b/web/modules/admin_toolbar/README.txt @@ -50,7 +50,7 @@ INSTALLATION CONFIGURATION ------------- -No configuration is needed. + * Configure the admin toolbar tools at (/admin/config/user-interface/settings). MAINTAINERS diff --git a/web/modules/admin_toolbar/admin_toolbar.info.yml b/web/modules/admin_toolbar/admin_toolbar.info.yml index 983bef388c..6d6b70d1de 100644 --- a/web/modules/admin_toolbar/admin_toolbar.info.yml +++ b/web/modules/admin_toolbar/admin_toolbar.info.yml @@ -1,14 +1,12 @@ name: Admin Toolbar description: Provides an improved drop-down menu interface to the site Toolbar. package: Administration - type: module -core_version_requirement: ^8.8.0 || ^9.0 - +core_version_requirement: ^8.8.0 || ^9 dependencies: - drupal:toolbar -# Information added by Drupal.org packaging script on 2020-10-06 -version: '8.x-2.4' +# Information added by Drupal.org packaging script on 2021-08-25 +version: '3.0.2' project: 'admin_toolbar' -datestamp: 1601998855 +datestamp: 1629882676 diff --git a/web/modules/admin_toolbar/admin_toolbar.libraries.yml b/web/modules/admin_toolbar/admin_toolbar.libraries.yml index 85b322a4e6..7dc0448de5 100755 --- a/web/modules/admin_toolbar/admin_toolbar.libraries.yml +++ b/web/modules/admin_toolbar/admin_toolbar.libraries.yml @@ -3,8 +3,19 @@ toolbar.tree: theme: css/admin.toolbar.css: {} js: - js/jquery.hoverIntent.js: {} js/admin_toolbar.js: {} dependencies: - core/jquery - core/drupal +toolbar.tree.hoverintent: + js: + js/jquery.hoverIntent.js: {} + js/admin_toolbar.hoverintent.js: {} + dependencies: + - core/jquery + +toolbar.tree.hover: + js: + js/admin_toolbar.hover.js: {} + dependencies: + - core/jquery diff --git a/web/modules/admin_toolbar/admin_toolbar.module b/web/modules/admin_toolbar/admin_toolbar.module index c02c3f4868..2b32b57995 100755 --- a/web/modules/admin_toolbar/admin_toolbar.module +++ b/web/modules/admin_toolbar/admin_toolbar.module @@ -16,6 +16,15 @@ function admin_toolbar_toolbar_alter(&$items) { $items['administration']['tray']['toolbar_administration']['#pre_render'] = [[AdminToolbar::class, 'preRenderTray']]; $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree'; + $hoverintent_functionality = \Drupal::config('admin_toolbar_tools.settings')->get('hoverintent_functionality'); + if ($hoverintent_functionality === TRUE) { + // Use jQuery hover() effect. + $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree.hoverintent'; + } + else { + // User hoverIntent plugin. + $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree.hover'; + } } /** diff --git a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml index 1e3882867e..3751d83ac0 100644 --- a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml +++ b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml @@ -8,7 +8,7 @@ core_version_requirement: ^8.8.0 || ^9.0 dependencies: - admin_toolbar:admin_toolbar -# Information added by Drupal.org packaging script on 2020-10-06 -version: '8.x-2.4' +# Information added by Drupal.org packaging script on 2021-08-25 +version: '3.0.2' project: 'admin_toolbar' -datestamp: 1601998855 +datestamp: 1629882676 diff --git a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module index 2aff07f402..a415d13620 100755 --- a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module +++ b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module @@ -58,8 +58,8 @@ function admin_toolbar_links_access_filter_preprocess_menu(&$variables) { * Hides links from admin menu, if user doesn't have access rights. */ function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$items) { - foreach ($items as $route => &$item) { - $route_name = $route; + foreach ($items as $menu_id => &$item) { + $route_name = NULL; $route_params = []; if (!empty($item['original_link'])) { /** @var \Drupal\Core\Menu\MenuLinkBase $original_link */ @@ -71,18 +71,28 @@ function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$i $route_name = $original_link->getRouteName(); $route_params = $original_link->getRouteParameters(); } + elseif (!empty($item['url'])) { + /** @var \Drupal\Core\Url $url */ + $url = $item['url']; + if ($url->isExternal()) { + // Do not filter external URL at all. + continue; + } + $route_name = $url->getRouteName(); + $route_params = $url->getRouteParameters(); + } // Check, if user has access rights to the route. if (!\Drupal::accessManager() ->checkNamedRoute($route_name, $route_params)) { - unset($items[$route]); + unset($items[$menu_id]); } else { - if (!empty($items[$route]['below'])) { + if (!empty($items[$menu_id]['below'])) { // Recursively call this function for the child items. - admin_toolbar_links_access_filter_filter_non_accessible_links($items[$route]['below']); + admin_toolbar_links_access_filter_filter_non_accessible_links($items[$menu_id]['below']); } - if (empty($items[$route]['below']) && \Drupal::moduleHandler() + if (empty($items[$menu_id]['below']) && \Drupal::moduleHandler() ->moduleExists('admin_toolbar')) { // Every child item has been cleared out. @@ -91,12 +101,17 @@ function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$i // unset this item, as there aren't any children left. // This assumption is only valid, when the admin_toolbar module is // installed because otherwise we won't have child items at all. - if (admin_toolbar_links_access_filter_is_overview_page($route)) { - unset($items[$route]); + if (admin_toolbar_links_access_filter_is_overview_page($route_name)) { + unset($items[$menu_id]); + } + // If there are no sub-items and the parent does not have a link, then + // it is safe to remove it. + elseif ($route_name === '<nolink>') { + unset($items[$menu_id]); } else { // Let's remove the expanded flag. - $items[$route]['is_expanded'] = FALSE; + $items[$menu_id]['is_expanded'] = FALSE; } } } diff --git a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml index 462a5ad513..2536e7a0c1 100644 --- a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml +++ b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml @@ -1,14 +1,12 @@ name: Admin Toolbar Search description: Provides search of Admin Toolbar items. package: Administration - type: module core_version_requirement: ^8.8.0 || ^9.0 - dependencies: - - admin_toolbar:admin_toolbar + - admin_toolbar:admin_toolbar_tools -# Information added by Drupal.org packaging script on 2020-10-06 -version: '8.x-2.4' +# Information added by Drupal.org packaging script on 2021-08-25 +version: '3.0.2' project: 'admin_toolbar' -datestamp: 1601998855 +datestamp: 1629882676 diff --git a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml index 977e6ce2c3..12950ea112 100644 --- a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml +++ b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml @@ -7,3 +7,4 @@ services: - '@router.route_provider' - '@cache_contexts_manager' - '@cache.toolbar' + - '@config.factory' diff --git a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css index d12e95bbbf..4e7b028d0d 100755 --- a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css +++ b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css @@ -4,7 +4,8 @@ } #admin-toolbar-search-input { - min-height: 1rem; + min-height: 30px; + height: 100%; padding: 0 0.4rem; line-height: 1.75rem; margin: 0; diff --git a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig deleted file mode 100755 index 3be4d4e705..0000000000 --- a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig +++ /dev/null @@ -1,20 +0,0 @@ -#admin-toolbar-search-tab .js-form-item.form-item { - margin-top: 0.3rem; - margin-bottom: 0; -} - -#admin-toolbar-search-input { - min-height: 1rem; - padding: 0 0.4rem; - line-height: 1.75rem; - margin: 0; - color: #3b3b3b; - background: #fcfcfa; - border: 1px solid #ccc; - border-radius: unset; - font-size: 1em; -} - -.ui-autocomplete .ui-menu-item span.admin-toolbar-search-url { - color: rgba(0, 0, 0, 0.50); -} diff --git a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js index 975f3b4a06..721da1f7c4 100755 --- a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js +++ b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js @@ -58,7 +58,7 @@ }).data("ui-autocomplete")._renderItem = (function (ul, item) { ul.addClass('admin-toolbar-search-autocomplete-list'); return $("<li>") - .append('<div>' + item.labelRaw + ' <span class="admin-toolbar-search-url">' + item.value + '</span></div>') + .append('<div>' + item.labelRaw + '<span class="admin-toolbar-search-url">' + '</span></div>') .appendTo(ul); }); @@ -124,7 +124,7 @@ $self.links.push({ 'value': this.href, 'label': label + ' ' + this.href, - 'labelRaw': label + 'labelRaw': Drupal.checkPlain(label) }); } }); diff --git a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig deleted file mode 100755 index 110040741e..0000000000 --- a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file - * Behaviors for the search widget in the admin toolbar. - */ - -(function ($, Drupal) { - - 'use strict'; - - Drupal.behaviors.adminToolbarSearch = { - - // If extra links have been fetched. - extraFetched: false, - - attach: function (context) { - if (context != document) { - return; - } - - var $self = this; - this.links = []; - - $("#admin-toolbar-search-input").autocomplete({ - minLength: 2, - source: function (request, response) { - var data = $self.handleAutocomplete(request.term); - if (!$self.extraFetched && drupalSettings.adminToolbarSearch.loadExtraLinks) { - $.getJSON( "/admin/admin-toolbar-search", function( data ) { - $(data).each(function() { - var item = this; - item.label = this.labelRaw + ' ' + this.value; - $self.links.push(item); - }); - - $self.extraFetched = true; - - var results = $self.handleAutocomplete(request.term); - response(results); - }); - } - else { - response(data); - } - }, - open: function () { - var zIndex = $('#toolbar-item-administration-tray') - .css("z-index") + 1; - $(this).autocomplete('widget').css('z-index', zIndex); - - return false; - }, - select: function (event, ui) { - if (ui.item.value) { - location.href = ui.item.value; - return false; - } - } - }).data("ui-autocomplete")._renderItem = (function (ul, item) { - return $("<li>") - .append('<div>' + item.labelRaw + ' <span class="admin-toolbar-search-url">' + item.value + '</span></div>') - .appendTo(ul); - }); - - // Populate the links for search results when the input is pressed. - $(context).find('#admin-toolbar-search-input') - .once('admin_toolbar_search') - .each(function () { - $(this).focus(function() { - Drupal.behaviors.adminToolbarSearch.populateLinks($self); - }); - }); - }, - getItemLabel: function (item) { - var breadcrumbs = []; - $(item).parents().each(function () { - if ($(this).hasClass('menu-item')) { - var $link = $(this).find('a:first'); - if ($link.length && !$link.hasClass('admin-toolbar-search-ignore')) { - breadcrumbs.unshift($link.text()); - } - } - }); - return breadcrumbs.join(' > '); - }, - handleAutocomplete: function (term) { - var $self = this; - var keywords = term.split(" "); // Split search terms into list. - - var suggestions = []; - $self.links.forEach(function (element) { - var label = element.label.toLowerCase(); - - // Add exact matches. - if (label.indexOf(term.toLowerCase()) >= 0) { - suggestions.push(element); - } - else { - // Add suggestions where it matches all search terms. - var matchCount = 0; - keywords.forEach(function (keyword) { - if (label.indexOf(keyword.toLowerCase()) >= 0) { - matchCount++; - } - }); - if (matchCount == keywords.length) { - suggestions.push(element); - } - } - }); - return suggestions; - }, - /** - * Populates the links in admin toolbar search. - */ - populateLinks: function ($self) { - // Populate only when links array is empty (only the first time). - if ($self.links.length === 0) { - var getUrl = window.location; - var baseUrl = getUrl.protocol + "//" + getUrl.host + "/"; - $('.toolbar-tray a[data-drupal-link-system-path]').each(function () { - if (this.href !== baseUrl) { - var label = $self.getItemLabel(this); - $self.links.push({ - 'value': this.href, - 'label': label + ' ' + this.href, - 'labelRaw': label - }); - } - }); - } - }, - }; - -})(jQuery, Drupal); diff --git a/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php b/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php index e36dba37a9..cff509f40d 100644 --- a/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php +++ b/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php @@ -2,10 +2,10 @@ namespace Drupal\admin_toolbar_search; -use Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks; use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Cache\Context\CacheContextsManager; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\LanguageInterface; @@ -56,6 +56,13 @@ class SearchLinks { */ protected $toolbarCache; + /** + * The admin toolbar tools configuration. + * + * @var \Drupal\Core\Config\Config + */ + protected $config; + /** * Constructs a SearchLinks object. * @@ -69,13 +76,16 @@ class SearchLinks { * The cache contexts manager. * @param \Drupal\Core\Cache\CacheBackendInterface $toolbar_cache * Cache backend instance to use. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * Config factory mservice. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, CacheContextsManager $cache_context_manager, CacheBackendInterface $toolbar_cache) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, CacheContextsManager $cache_context_manager, CacheBackendInterface $toolbar_cache, ConfigFactoryInterface $config_factory) { $this->entityTypeManager = $entity_type_manager; $this->moduleHandler = $module_handler; $this->routeProvider = $route_provider; $this->cacheContextManager = $cache_context_manager; $this->toolbarCache = $toolbar_cache; + $this->config = $config_factory->get('admin_toolbar_tools.settings'); } /** @@ -88,6 +98,7 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Mod * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function getLinks() { + $max_bundle_number = $this->config->get('max_bundle_number'); $additional_keys = $this->cacheContextManager->convertTokensToKeys([ 'languages:' . LanguageInterface::TYPE_INTERFACE, 'user.permissions', @@ -107,9 +118,9 @@ public function getLinks() { foreach ($content_entities as $entities) { $content_entity_bundle = $entities['content_entity_bundle']; $content_entity = $entities['content_entity']; - // Start at offset 10, since the toolbar has already loaded the first 10. + // Load the remaining items that were not loaded by the toolbar. $content_entity_bundle_storage = $this->entityTypeManager->getStorage($content_entity_bundle); - $bundles_ids = $content_entity_bundle_storage->getQuery()->range(ExtraLinks::MAX_BUNDLE_NUMBER)->execute(); + $bundles_ids = $content_entity_bundle_storage->getQuery()->range($max_bundle_number)->execute(); if (!empty($bundles_ids)) { $bundles = $this->entityTypeManager ->getStorage($content_entity_bundle) @@ -126,62 +137,75 @@ public function getLinks() { // Some bundles have an overview/list form that make a better root // link. $url = Url::fromRoute('entity.' . $content_entity_bundle . '.overview_form', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base, - 'value' => $url_string, - ]; + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base, + 'value' => $url_string, + ]; + } } if ($this->routeExists('entity.' . $content_entity_bundle . '.edit_form')) { $url = Url::fromRoute('entity.' . $content_entity_bundle . '.edit_form', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Edit'), - 'value' => $url_string, - ]; - } - if ($this->moduleHandler->moduleExists('field_ui')) { - if ($this->routeExists('entity.' . $content_entity . '.field_ui_fields')) { - $url = Url::fromRoute('entity.' . $content_entity . '.field_ui_fields', $params); + if ($url->access()) { $url_string = $url->toString(); $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Manage fields'), + 'labelRaw' => $label_base . ' > ' . $this->t('Edit'), 'value' => $url_string, ]; } + } + if ($this->moduleHandler->moduleExists('field_ui')) { + if ($this->routeExists('entity.' . $content_entity . '.field_ui_fields')) { + $url = Url::fromRoute('entity.' . $content_entity . '.field_ui_fields', $params); + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base . ' > ' . $this->t('Manage fields'), + 'value' => $url_string, + ]; + } + } if ($this->routeExists('entity.entity_form_display.' . $content_entity . '.default')) { $url = Url::fromRoute('entity.entity_form_display.' . $content_entity . '.default', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Manage form display'), - 'value' => $url_string, - ]; - + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base . ' > ' . $this->t('Manage form display'), + 'value' => $url_string, + ]; + } } if ($this->routeExists('entity.entity_view_display.' . $content_entity . '.default')) { $url = Url::fromRoute('entity.entity_view_display.' . $content_entity . '.default', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Manage display'), - 'value' => $url_string, - ]; + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base . ' > ' . $this->t('Manage display'), + 'value' => $url_string, + ]; + } } if ($this->moduleHandler->moduleExists('devel') && $this->routeExists('entity.' . $content_entity_bundle . '.devel_load')) { $url = Url::fromRoute($route_name = 'entity.' . $content_entity_bundle . '.devel_load', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Devel'), - 'value' => $url_string, - ]; + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base . ' > ' . $this->t('Devel'), + 'value' => $url_string, + ]; + } } if ($this->routeExists('entity.' . $content_entity_bundle . '.delete_form')) { $url = Url::fromRoute('entity.' . $content_entity_bundle . '.delete_form', $params); - $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $label_base . ' > ' . $this->t('Delete'), - 'value' => $url_string, - ]; + if ($url->access()) { + $url_string = $url->toString(); + $links[] = [ + 'labelRaw' => $label_base . ' > ' . $this->t('Delete'), + 'value' => $url_string, + ]; + } } } } @@ -193,29 +217,33 @@ public function getLinks() { $menus = $this->entityTypeManager->getStorage('menu')->loadMultiple(); uasort($menus, [Menu::class, 'sort']); - $menus = array_slice($menus, ExtraLinks::MAX_BUNDLE_NUMBER); + $menus = array_slice($menus, $max_bundle_number); $cache_tags = Cache::mergeTags($cache_tags, ['config:menu_list']); foreach ($menus as $menu_id => $menu) { $route_name = 'entity.menu.edit_form'; $params = ['menu' => $menu_id]; $url = Url::fromRoute($route_name, $params); - $url_string = $url->toString(); + if ($url->access()) { + $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $this->t('Menus') . ' > ' . $menu->label(), - 'value' => $url_string, - ]; + $links[] = [ + 'labelRaw' => $this->t('Menus > @menu_label', ['@menu_label' => $menu->label()]), + 'value' => $url_string, + ]; + } $route_name = 'entity.menu.add_link_form'; $params = ['menu' => $menu_id]; $url = Url::fromRoute($route_name, $params); - $url_string = $url->toString(); + if ($url->access()) { + $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Add link'), - 'value' => $url_string, - ]; + $links[] = [ + 'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Add link'), + 'value' => $url_string, + ]; + } $menus = ['admin', 'devel', 'footer', 'main', 'tools', 'account']; if (!in_array($menu_id, $menus)) { @@ -223,23 +251,27 @@ public function getLinks() { $route_name = 'entity.menu.delete_form'; $params = ['menu' => $menu_id]; $url = Url::fromRoute($route_name, $params); - $url_string = $url->toString(); + if ($url->access()) { + $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Delete'), - 'value' => $url_string, - ]; + $links[] = [ + 'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Delete'), + 'value' => $url_string, + ]; + } } if ($this->moduleHandler->moduleExists('devel') && $this->routeExists('entity.menu.devel_load')) { $route_name = 'entity.menu.devel_load'; $params = ['menu' => $menu_id]; $url = Url::fromRoute($route_name, $params); - $url_string = $url->toString(); + if ($url->access()) { + $url_string = $url->toString(); - $links[] = [ - 'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Devel'), - 'value' => $url_string, - ]; + $links[] = [ + 'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Devel'), + 'value' => $url_string, + ]; + } } } } diff --git a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php index 6a16c5882e..8738781051 100755 --- a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php +++ b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php @@ -21,7 +21,7 @@ abstract class AdminToolbarSearchTestBase extends WebDriverTestBase { /** * {@inheritdoc} */ - public static $modules = [ + protected static $modules = [ 'admin_toolbar_search', 'node', 'media', @@ -47,7 +47,7 @@ abstract class AdminToolbarSearchTestBase extends WebDriverTestBase { /** * {@inheritdoc} */ - public function setUp() { + public function setUp(): void { parent::setUp(); $baby_names = [ @@ -119,7 +119,7 @@ protected function assertSuggestionContains($search, $contains) { return ($page->find('css', 'ul.ui-autocomplete')->isVisible() === TRUE); }); $suggestions_markup = $page->find('css', 'ul.ui-autocomplete')->getHtml(); - $this->assertContains($contains, $suggestions_markup); + $this->assertStringContainsString($contains, $suggestions_markup); } /** diff --git a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php index 84604bc077..b1bf1173ef 100755 --- a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php +++ b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php @@ -18,7 +18,7 @@ class AdminToolbarToolsSearchTest extends AdminToolbarSearchTestBase { /** * {@inheritdoc} */ - public static $modules = [ + protected static $modules = [ 'admin_toolbar_tools', 'admin_toolbar_search', 'node', @@ -38,7 +38,7 @@ class AdminToolbarToolsSearchTest extends AdminToolbarSearchTestBase { /** * {@inheritdoc} */ - public function setUp() { + public function setUp(): void { parent::setUp(); $this->drupalCreateContentType([ @@ -67,6 +67,16 @@ public function setUp() { 'ruby' => 'Ruby', 'teddy' => 'Teddy', 'toby' => 'Toby', + 'tonga' => 'Tonga', + 'tracey' => 'Tracey', + 'tuna' => 'Tuna', + 'uno' => 'Uno', + 'venus' => 'Venus', + 'vicky' => 'Vicky', + 'wimpy' => 'Wimpy', + 'yellow' => 'Yellow', + 'zac' => 'zac', + 'zora' => 'zora', ]; foreach ($dog_names as $machine_name => $label) { @@ -118,15 +128,6 @@ public function testToolbarSearch() { $this->drupalGet('/admin/admin-toolbar-search'); $search_menus = [ - 'cora', - 'eleanor', - 'eloise', - 'felix', - 'freya', - 'genevieve', - 'isla', - 'jasper', - 'luna', 'maeve', 'milo', 'nora', @@ -184,12 +185,12 @@ public function testToolbarSearch() { // Test that bundle within admin toolbar appears in search. $this->assertSuggestionContains('lola', 'admin/structure/media/manage/lola/fields'); - // Assert that a link after the limit (10) doesn't appear in admin toolbar. - $toby_url = '/admin/structure/media/manage/toby/fields'; - $assert_session->elementNotContains('css', '#toolbar-administration', $toby_url); + // Assert that a link after the limit doesn't appear in admin toolbar. + $zora_url = '/admin/structure/media/manage/zora/fields'; + $assert_session->elementNotContains('css', '#toolbar-administration', $zora_url); // Assert that a link excluded from admin toolbar appears in search. - $this->assertSuggestionContains('toby', $toby_url); + $this->assertSuggestionContains('zora', $zora_url); // Test that adding a new bundle updates the extra links loaded from // admin_toolbar.search route. @@ -204,12 +205,12 @@ public function testToolbarSearch() { // Test that deleting a bundle updates the extra links loaded from // admin_toolbar.search route. - $toby = MediaType::load('toby'); - $toby->delete(); + $zora = MediaType::load('zora'); + $zora->delete(); $this->getSession()->reload(); $assert_session->waitForElementVisible('css', $search_tray); - $this->assertSuggestionNotContains('toby', $toby_url); + $this->assertSuggestionNotContains('zora', $zora); } } diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml index 73cc5d7b0a..1bfd11c27a 100644 --- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml +++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml @@ -1,14 +1,13 @@ name: Admin Toolbar Extra Tools description: Adds menu links like Flush cache, Run cron, Run updates, and Logout under Drupal icon. package: Administration - +configure: admin_toolbar_tools.settings type: module core_version_requirement: ^8.8.0 || ^9.0 - dependencies: - admin_toolbar:admin_toolbar -# Information added by Drupal.org packaging script on 2020-10-06 -version: '8.x-2.4' +# Information added by Drupal.org packaging script on 2021-08-25 +version: '3.0.2' project: 'admin_toolbar' -datestamp: 1601998855 +datestamp: 1629882676 diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install index 1cc14c73d3..fae84ba5cd 100644 --- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install +++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install @@ -12,3 +12,23 @@ function admin_toolbar_tools_update_8001() { // Installing the Admin Toolbar Search module. \Drupal::service('module_installer')->install(['admin_toolbar_search']); } + +/** + * Default setting for maximum number of bundles per entity type to display. + */ +function admin_toolbar_tools_update_8201() { + \Drupal::service('config.factory') + ->getEditable('admin_toolbar_tools.settings') + ->set('max_bundle_number', 20) + ->save(TRUE); +} + +/** + * Default setting for enable hoverintent. + */ +function admin_toolbar_tools_update_8202() { + \Drupal::service('config.factory') + ->getEditable('admin_toolbar_tools.settings') + ->set('hoverintent_functionality', TRUE) + ->save(TRUE); +} diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml index 670a4f76c6..7b006bae4f 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml +++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml @@ -40,7 +40,7 @@ admin_toolbar_tools.flush: menu_name: admin admin_toolbar_tools.cssjs: - title: 'Flush CSS and Javascript' + title: 'Flush CSS and JavaScript' route_name: admin_toolbar_tools.cssjs parent: admin_toolbar_tools.flush menu_name: admin @@ -84,3 +84,9 @@ admin_toolbar_tools.theme_rebuild: admin_toolbar_tools.extra_links: deriver: \Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks menu_name: admin + +admin_toolbar_tools.settings: + title: 'Admin Toolbar Tools' + description: 'Configure the Admin Toolbar Tools module.' + route_name: admin_toolbar_tools.settings + parent: system.admin_config_ui diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml index bcae9db1b7..e5a0bfd5dc 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml +++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml @@ -11,7 +11,7 @@ admin_toolbar_tools.cssjs: path: '/admin/flush/cssjs' defaults: _controller: '\Drupal\admin_toolbar_tools\Controller\ToolbarController::flushJsCss' - _title: 'Flush Css and Javascript' + _title: 'Flush CSS and JavaScript' requirements: _permission: 'administer site configuration' _csrf_token: 'TRUE' @@ -87,3 +87,11 @@ admin_toolbar.run.cron: requirements: _permission: 'administer site configuration' _csrf_token: 'TRUE' + +admin_toolbar_tools.settings: + path: '/admin/config/user-interface/admin-toolbar-tools' + defaults: + _form: '\Drupal\admin_toolbar_tools\Form\AdminToolbarToolsSettingsForm' + _title: 'Admin Toolbar Tools settings' + requirements: + _permission: 'administer site configuration' diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml b/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml new file mode 100644 index 0000000000..2f4de2018d --- /dev/null +++ b/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml @@ -0,0 +1,2 @@ +max_bundle_number: 20 +hoverintent_functionality: true diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml b/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml new file mode 100644 index 0000000000..1280d38fb0 --- /dev/null +++ b/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml @@ -0,0 +1,10 @@ +admin_toolbar_tools.settings: + type: config_object + label: 'Admin Toolbar Tools settings' + mapping: + max_bundle_number: + type: integer + label: 'Number of bundles per entity type to display' + hoverintent_functionality: + type: boolean + label: 'Enable or disable hoverintent functionality' diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css b/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css index 708ea38fc6..9233a708da 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css +++ b/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css @@ -18,6 +18,7 @@ } .toolbar-icon-8 .toolbar-icon-admin-toolbar-tools-help:before { + box-sizing: content-box; background-image: url(../misc/icons/ffffff/drupal-8-logo.svg); padding-bottom: 0; padding-left: 4px; diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php index 22ccded1fc..dcb9d2b883 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php +++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php @@ -193,7 +193,7 @@ public function reloadPage() { return $request->server->get('HTTP_REFERER'); } else { - return '/'; + return base_path(); } } diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php new file mode 100644 index 0000000000..ecdb03fe5e --- /dev/null +++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php @@ -0,0 +1,111 @@ +<?php + +namespace Drupal\admin_toolbar_tools\Form; + +use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Form\ConfigFormBase; +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Menu\MenuLinkManagerInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Class AdminToolbarToolsSettingsForm. + * + * @package Drupal\admin_toolbar_tools\Form + */ +class AdminToolbarToolsSettingsForm extends ConfigFormBase { + + /** + * The cache menu instance. + * + * @var \Drupal\Core\Cache\CacheBackendInterface + */ + protected $cacheMenu; + + /** + * The menu link manager instance. + * + * @var \Drupal\Core\Menu\MenuLinkManagerInterface + */ + protected $menuLinkManager; + + /** + * AdminToolbarToolsSettingsForm constructor. + * + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The factory for configuration objects. + * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menuLinkManager + * A menu link manager instance. + * @param \Drupal\Core\Cache\CacheBackendInterface $cacheMenu + * A cache menu instance. + */ + public function __construct(ConfigFactoryInterface $configFactory, MenuLinkManagerInterface $menuLinkManager, CacheBackendInterface $cacheMenu) { + parent::__construct($configFactory); + $this->cacheMenu = $cacheMenu; + $this->menuLinkManager = $menuLinkManager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('config.factory'), + $container->get('plugin.manager.menu.link'), + $container->get('cache.menu') + ); + } + + /** + * {@inheritdoc} + */ + protected function getEditableConfigNames() { + return [ + 'admin_toolbar_tools.settings', + ]; + } + + /** + * {@inheritdoc} + */ + public function getFormId() { + return 'admin_toolbar_tools_settings'; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + $config = $this->config('admin_toolbar_tools.settings'); + $form['max_bundle_number'] = [ + '#type' => 'number', + '#title' => $this->t('Maximum number of bundle sub-menus to display'), + '#description' => $this->t('Loading a large number of items can cause performance issues.'), + '#default_value' => $config->get('max_bundle_number'), + ]; + + $form['hoverintent_functionality'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Enable/Disable the hoverintent functionality'), + '#description' => $this->t('Check it if you want to enable the hoverintent feature.'), + '#default_value' => $config->get('hoverintent_functionality'), + ]; + + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $this->config('admin_toolbar_tools.settings') + ->set('max_bundle_number', $form_state->getValue('max_bundle_number')) + ->set('hoverintent_functionality', $form_state->getValue('hoverintent_functionality')) + ->save(); + parent::submitForm($form, $form_state); + $this->cacheMenu->invalidateAll(); + $this->menuLinkManager->rebuild(); + } + +} diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php index e9d6de8f57..4d98f3e2b7 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php +++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php @@ -3,6 +3,7 @@ namespace Drupal\admin_toolbar_tools\Plugin\Derivative; use Drupal\Component\Plugin\Derivative\DeriverBase; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Extension\ThemeHandlerInterface; @@ -19,8 +20,6 @@ class ExtraLinks extends DeriverBase implements ContainerDeriverInterface { use StringTranslationTrait; - const MAX_BUNDLE_NUMBER = 10; - /** * The entity type manager. * @@ -49,14 +48,22 @@ class ExtraLinks extends DeriverBase implements ContainerDeriverInterface { */ protected $themeHandler; + /** + * The admin toolbar tools configuration. + * + * @var \Drupal\Core\Config\Config + */ + protected $config; + /** * {@inheritdoc} */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, ThemeHandlerInterface $theme_handler) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory) { $this->entityTypeManager = $entity_type_manager; $this->moduleHandler = $module_handler; $this->routeProvider = $route_provider; $this->themeHandler = $theme_handler; + $this->config = $config_factory->get('admin_toolbar_tools.settings'); } /** @@ -67,7 +74,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) { $container->get('entity_type.manager'), $container->get('module_handler'), $container->get('router.route_provider'), - $container->get('theme_handler') + $container->get('theme_handler'), + $container->get('config.factory') ); } @@ -76,6 +84,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) { */ public function getDerivativeDefinitions($base_plugin_definition) { $links = []; + $max_bundle_number = $this->config->get('max_bundle_number'); $entity_types = $this->entityTypeManager->getDefinitions(); $content_entities = []; foreach ($entity_types as $key => $entity_type) { @@ -91,11 +100,10 @@ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($content_entities as $entities) { $content_entity_bundle = $entities['content_entity_bundle']; $content_entity = $entities['content_entity']; - // We do not display more than 10 different bundles per entity type. $content_entity_bundle_storage = $this->entityTypeManager->getStorage($content_entity_bundle); - $bundles_ids = $content_entity_bundle_storage->getQuery()->pager(self::MAX_BUNDLE_NUMBER)->execute(); + $bundles_ids = $content_entity_bundle_storage->getQuery()->pager($max_bundle_number)->execute(); $bundles = $this->entityTypeManager->getStorage($content_entity_bundle)->loadMultiple($bundles_ids); - if (count($bundles) == self::MAX_BUNDLE_NUMBER && $this->routeExists('entity.' . $content_entity_bundle . '.collection')) { + if (count($bundles) == $max_bundle_number && $this->routeExists('entity.' . $content_entity_bundle . '.collection')) { $links[$content_entity_bundle . '.collection'] = [ 'title' => $this->t('All types'), 'route_name' => 'entity.' . $content_entity_bundle . '.collection', @@ -111,22 +119,33 @@ public function getDerivativeDefinitions($base_plugin_definition) { // link. $content_entity_bundle_root = 'entity.' . $content_entity_bundle . '.overview_form.' . $machine_name; $links[$content_entity_bundle_root] = [ - 'title' => $this->t('@label', ['@label' => $bundle->label()]), 'route_name' => 'entity.' . $content_entity_bundle . '.overview_form', 'parent' => 'entity.' . $content_entity_bundle . '.collection', 'route_parameters' => [$content_entity_bundle => $machine_name], + 'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity', + 'metadata' => [ + 'entity_type' => $bundle->getEntityTypeId(), + 'entity_id' => $bundle->id(), + ], ] + $base_plugin_definition; } if ($this->routeExists('entity.' . $content_entity_bundle . '.edit_form')) { $key = 'entity.' . $content_entity_bundle . '.edit_form.' . $machine_name; $links[$key] = [ - 'title' => $this->t('@label', ['@label' => $bundle->label()]), 'route_name' => 'entity.' . $content_entity_bundle . '.edit_form', 'parent' => 'entity.' . $content_entity_bundle . '.collection', 'route_parameters' => [$content_entity_bundle => $machine_name], ] + $base_plugin_definition; if (empty($content_entity_bundle_root)) { $content_entity_bundle_root = $key; + $links[$key]['parent'] = 'entity.' . $content_entity_bundle . '.collection'; + + // When not grouped by bundle, use bundle name as title. + $links[$key]['class'] = 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity'; + $links[$key]['metadata'] = [ + 'entity_type' => $bundle->getEntityTypeId(), + 'entity_id' => $bundle->id(), + ]; } else { $links[$key]['parent'] = $base_plugin_definition['id'] . ':' . $content_entity_bundle_root; @@ -209,7 +228,7 @@ public function getDerivativeDefinitions($base_plugin_definition) { 'title' => $this->t('Add role'), 'route_name' => 'user.role_add', 'parent' => $base_plugin_definition['id'] . ':entity.user_role.collection', - 'weight' => -5, + 'weight' => -50, ] + $base_plugin_definition; // Adds sub-links to Account settings link. if ($this->moduleHandler->moduleExists('field_ui')) { @@ -235,10 +254,15 @@ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->entityTypeManager->getStorage('user_role')->loadMultiple() as $role) { $links['entity.user_role.edit_form.' . $role->id()] = [ - 'title' => $this->t('@label', ['@label' => $role->label()]), 'route_name' => 'entity.user_role.edit_form', 'parent' => $base_plugin_definition['id'] . ':entity.user_role.collection', + 'weight' => $role->getWeight(), 'route_parameters' => ['user_role' => $role->id()], + 'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity', + 'metadata' => [ + 'entity_type' => $role->getEntityTypeId(), + 'entity_id' => $role->id(), + ], ] + $base_plugin_definition; $links['entity.user_role.edit_permissions_form.' . $role->id()] = [ 'title' => $this->t('Edit permissions'), @@ -279,10 +303,14 @@ public function getDerivativeDefinitions($base_plugin_definition) { // Adds node links for each content type. foreach ($this->entityTypeManager->getStorage('node_type')->loadMultiple() as $type) { $links['node.add.' . $type->id()] = [ - 'title' => $this->t('@label', ['@label' => $type->label()]), 'route_name' => 'node.add', 'parent' => $base_plugin_definition['id'] . ':node.add', 'route_parameters' => ['node_type' => $type->id()], + 'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity', + 'metadata' => [ + 'entity_type' => $type->getEntityTypeId(), + 'entity_id' => $type->id(), + ], ] + $base_plugin_definition; } } @@ -317,11 +345,10 @@ public function getDerivativeDefinitions($base_plugin_definition) { 'weight' => -2, ] + $base_plugin_definition; // Adds links to /admin/structure/menu. - // We do not display more than 10 different menus. $menus = $this->entityTypeManager->getStorage('menu')->loadMultiple(); uasort($menus, [Menu::class, 'sort']); - $menus = array_slice($menus, 0, self::MAX_BUNDLE_NUMBER); - if (count($menus) == self::MAX_BUNDLE_NUMBER) { + $menus = array_slice($menus, 0, $max_bundle_number); + if (count($menus) == $max_bundle_number) { $links['entity.menu.collection'] = [ 'title' => $this->t('All menus'), 'route_name' => 'entity.menu.collection', @@ -332,11 +359,15 @@ public function getDerivativeDefinitions($base_plugin_definition) { $weight = 0; foreach ($menus as $menu_id => $menu) { $links['entity.menu.edit_form.' . $menu_id] = [ - 'title' => $menu->label(), 'route_name' => 'entity.menu.edit_form', 'parent' => 'entity.menu.collection', 'route_parameters' => ['menu' => $menu_id], 'weight' => $weight, + 'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity', + 'metadata' => [ + 'entity_type' => $menu->getEntityTypeId(), + 'entity_id' => $menu->id(), + ], ] + $base_plugin_definition; $links['entity.menu.add_link_form.' . $menu_id] = [ 'title' => $this->t('Add link'), @@ -554,6 +585,13 @@ public function getDerivativeDefinitions($base_plugin_definition) { 'route_name' => 'entity.media.collection', 'parent' => 'system.admin_content', ] + $base_plugin_definition; + if ($this->moduleHandler->moduleExists('media_library')) { + $links['media_library'] = [ + 'title' => $this->t('Media library'), + 'route_name' => 'view.media_library.page', + 'parent' => $base_plugin_definition['id'] . ':media_page', + ] + $base_plugin_definition; + } $links['add_media'] = [ 'title' => $this->t('Add media'), 'route_name' => 'entity.media.add_page', @@ -562,10 +600,14 @@ public function getDerivativeDefinitions($base_plugin_definition) { // Adds links for each media type. foreach ($this->entityTypeManager->getStorage('media_type')->loadMultiple() as $type) { $links['media.add.' . $type->id()] = [ - 'title' => $type->label(), 'route_name' => 'entity.media.add_form', 'parent' => $base_plugin_definition['id'] . ':add_media', 'route_parameters' => ['media_type' => $type->id()], + 'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity', + 'metadata' => [ + 'entity_type' => $type->getEntityTypeId(), + 'entity_id' => $type->id(), + ], ] + $base_plugin_definition; } } diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php new file mode 100644 index 0000000000..195837a198 --- /dev/null +++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php @@ -0,0 +1,107 @@ +<?php + +namespace Drupal\admin_toolbar_tools\Plugin\Menu; + +use Drupal\Core\Entity\EntityDescriptionInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Menu\MenuLinkDefault; +use Drupal\Core\Menu\StaticMenuLinkOverridesInterface; +use Drupal\node\NodeTypeInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Provides a menu link plugins for configuration entities. + */ +class MenuLinkEntity extends MenuLinkDefault { + + /** + * The entity represented in the menu link. + * + * @var \Drupal\Core\Entity\EntityInterface + */ + protected $entity; + + /** + * Constructs a new MenuLinkEntity. + * + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param \Drupal\Core\Menu\StaticMenuLinkOverridesInterface $static_override + * The static override storage. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, StaticMenuLinkOverridesInterface $static_override, EntityTypeManagerInterface $entity_type_manager) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $static_override); + $this->entity = $entity_type_manager->getStorage($this->pluginDefinition['metadata']['entity_type'])->load($this->pluginDefinition['metadata']['entity_id']); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('menu_link.static.overrides'), + $container->get('entity_type.manager') + ); + } + + /** + * {@inheritdoc} + */ + public function getTitle() { + if ($this->entity) { + return (string) $this->entity->label(); + } + return $this->pluginDefinition['title'] ?: $this->t('Missing'); + } + + /** + * {@inheritdoc} + */ + public function getDescription() { + // @todo Remove node_type special handling. + if ($this->entity instanceof EntityDescriptionInterface || $this->entity instanceof NodeTypeInterface) { + return $this->entity->getDescription(); + } + return parent::getDescription(); + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + if ($this->entity) { + return $this->entity->getCacheContexts(); + } + return parent::getCacheContexts(); + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + if ($this->entity) { + return $this->entity->getCacheTags(); + } + return parent::getCacheTags(); + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + if ($this->entity) { + return $this->entity->getCacheMaxAge(); + } + return parent::getCacheMaxAge(); + } + +} diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php b/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php index 9669a49a5f..3e9a7cdcd7 100755 --- a/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php +++ b/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php @@ -37,7 +37,7 @@ class AdminToolbarToolsAlterTest extends BrowserTestBase { /** * {@inheritdoc} */ - protected function setUp() { + protected function setUp(): void { parent::setUp(); // Create and log in an administrative user. $this->adminUser = $this->drupalCreateUser([ diff --git a/web/modules/admin_toolbar/css/admin.toolbar.css b/web/modules/admin_toolbar/css/admin.toolbar.css index a04575263a..a04b172125 100755 --- a/web/modules/admin_toolbar/css/admin.toolbar.css +++ b/web/modules/admin_toolbar/css/admin.toolbar.css @@ -8,7 +8,7 @@ .toolbar-tray-horizontal .toolbar-menu:not(:first-child) li.menu-item--expanded > a:focus { background-position: center right; - background-image: url('../misc/icons/0074bd/chevron-right.svg'); + background-image: url(../misc/icons/0074bd/chevron-right.svg); background-repeat: no-repeat; } @@ -24,18 +24,18 @@ .toolbar-tray-horizontal ul li li.menu-item { border-top: none transparent; - border-right: 1px solid #dddddd; - border-bottom: 1px solid #dddddd; - border-left: 1px solid #dddddd; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; + border-left: 1px solid #ddd; } .toolbar .toolbar-tray-horizontal .menu-item:last-child { - border-left: 1px solid #dddddd; - border-right: 1px solid #dddddd; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; } .toolbar .toolbar-tray-horizontal ul ul li.menu-item:first-child { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .toolbar-tray-horizontal li.menu-item--expanded.hover-intent ul ul, @@ -65,7 +65,7 @@ display: block; position: absolute; width: 200px; - box-shadow: 2px 2px 3px hsla(0, 0%, 0%, 0.4); + box-shadow: 2px 2px 3px hsla(0, 0, 0, 0.4); z-index: 1; } @@ -75,7 +75,7 @@ .toolbar-tray-horizontal ul li.menu-item--expanded ul li.menu-item--expanded { background-position: center right; - background-image: url('../misc/icons/0074bd/chevron-right.svg'); + background-image: url(../misc/icons/0074bd/chevron-right.svg); background-repeat: no-repeat; } @@ -121,7 +121,7 @@ [dir="rtl"] .toolbar-tray-horizontal .toolbar-menu:not(:first-child) li.menu-item--expanded > a:focus { background-position: center right; - background-image: url('../misc/icons/0074bd/chevron-right.svg'); + background-image: url(../misc/icons/0074bd/chevron-right.svg); background-repeat: no-repeat; } @@ -137,18 +137,18 @@ [dir="rtl"] .toolbar-tray-horizontal ul li li.menu-item { border-top: none transparent; - border-right: 1px solid #dddddd; - border-bottom: 1px solid #dddddd; - border-left: 1px solid #dddddd; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; + border-left: 1px solid #ddd; } [dir="rtl"] .toolbar .toolbar-tray-horizontal .menu-item:last-child { - border-left: 1px solid #dddddd; - border-right: 1px solid #dddddd; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; } [dir="rtl"] .toolbar .toolbar-tray-horizontal ul ul li.menu-item:first-child { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } [dir="rtl"] .toolbar-tray-horizontal li.menu-item--expanded.hover-intent ul ul, @@ -178,7 +178,7 @@ display: block; position: absolute; width: 200px; - box-shadow: 2px 2px 3px hsla(0, 0%, 0%, 0.4); + box-shadow: 2px 2px 3px hsla(0, 0, 0, 0.4); z-index: 1; } @@ -188,7 +188,7 @@ [dir="rtl"] .toolbar-tray-horizontal ul li.menu-item--expanded ul li.menu-item--expanded { background-position: center left; - background-image: url('../misc/icons/0074bd/chevron-left.svg'); + background-image: url(../misc/icons/0074bd/chevron-left.svg); background-repeat: no-repeat; } diff --git a/web/modules/admin_toolbar/css/admin.toolbar_search.css b/web/modules/admin_toolbar/css/admin.toolbar_search.css index bd99553855..115c0c2fde 100755 --- a/web/modules/admin_toolbar/css/admin.toolbar_search.css +++ b/web/modules/admin_toolbar/css/admin.toolbar_search.css @@ -3,17 +3,17 @@ } #admin-toolbar-search-tab .toolbar-item:before { - background-image: url('../misc/icons/bebebe/loupe.svg'); + background-image: url(../misc/icons/bebebe/loupe.svg); } #admin-toolbar-search-tab .toolbar-item:active:before, #admin-toolbar-search-tab .toolbar-item.is-active:before { - background-image: url('../misc/icons/ffffff/loupe.svg'); + background-image: url(../misc/icons/ffffff/loupe.svg); } #toolbar-item-administration-search-tray label { display: inline-block; - color: #000000; + color: #000; margin-right: .5em; font-weight: bold; } @@ -29,5 +29,5 @@ } .ui-autocomplete .ui-menu-item span.admin-toolbar-search-url { - color: rgba(0, 0, 0, 0.50); + color: rgba(0, 0, 0, 0.5); } diff --git a/web/modules/admin_toolbar/js/admin_toolbar.hover.js b/web/modules/admin_toolbar/js/admin_toolbar.hover.js new file mode 100644 index 0000000000..11da3cd844 --- /dev/null +++ b/web/modules/admin_toolbar/js/admin_toolbar.hover.js @@ -0,0 +1,13 @@ +(function ($) { + $(document).ready(function () { + $('.toolbar-tray.is-active.toolbar-tray-horizontal .menu-item.menu-item--expanded').hover(function () { + // At the current depth, we should delete all "hover-intent" classes. + // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones. + $(this).parent().find('li').removeClass('hover-intent'); + $(this).addClass('hover-intent'); + }, + function () { + $(this).removeClass('hover-intent'); + }); + }); +})(jQuery); diff --git a/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js b/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js new file mode 100644 index 0000000000..955e3bcbab --- /dev/null +++ b/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js @@ -0,0 +1,16 @@ +(function ($) { + $(document).ready(function () { + $('.toolbar-tray-horizontal li.menu-item--expanded, .toolbar-tray-horizontal ul li.menu-item--expanded .menu-item').hoverIntent({ + over: function () { + // At the current depth, we should delete all "hover-intent" classes. + // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones. + $(this).parent().find('li').removeClass('hover-intent'); + $(this).addClass('hover-intent'); + }, + out: function () { + $(this).removeClass('hover-intent'); + }, + timeout: 250 + }); + }); +})(jQuery); diff --git a/web/modules/admin_toolbar/js/admin_toolbar.js b/web/modules/admin_toolbar/js/admin_toolbar.js index 2458c32d86..6e2a7af171 100755 --- a/web/modules/admin_toolbar/js/admin_toolbar.js +++ b/web/modules/admin_toolbar/js/admin_toolbar.js @@ -4,19 +4,6 @@ $('a.toolbar-icon', context).removeAttr('title'); - $('.toolbar-tray li.menu-item--expanded, .toolbar-tray ul li.menu-item--expanded .menu-item', context).hoverIntent({ - over: function () { - // At the current depth, we should delete all "hover-intent" classes. - // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones. - $(this).parent().find('li').removeClass('hover-intent'); - $(this).addClass('hover-intent'); - }, - out: function () { - $(this).removeClass('hover-intent'); - }, - timeout: 250 - }); - // Make the toolbar menu navigable with keyboard. $('ul.toolbar-menu li.menu-item--expanded a', context).on('focusin', function () { $('li.menu-item--expanded', context).removeClass('hover-intent'); diff --git a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php index c17f575ee5..28ba1831fd 100755 --- a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php +++ b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php @@ -37,7 +37,7 @@ class AdminToolbarAlterTest extends BrowserTestBase { /** * {@inheritdoc} */ - protected function setUp() { + protected function setUp(): void { parent::setUp(); // Create and log in an administrative user. diff --git a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php index 8da6ca9ae2..4a54a79de1 100644 --- a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php +++ b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php @@ -120,18 +120,23 @@ public function testMenuSorting() { ]); $menus = [ - 'aaa' => 'lll', - 'bbb' => 'kkk', - 'ccc' => 'jjj', - 'ddd' => 'iii', - 'eee' => 'hhh', - 'fff' => 'ggg', - 'ggg' => 'fff', - 'hhh' => 'eee', - 'iii' => 'ddd', - 'jjj' => 'ccc', - 'kkk' => 'bbb', - 'lll' => 'aaa', + 'aaa' => 'qqq', + 'bbb' => 'ppp', + 'ccc' => 'ooo', + 'ddd' => 'nnn', + 'eee' => 'mmm', + 'fff' => 'lll', + 'ggg' => 'kkk', + 'hhh' => 'jjj', + 'iii' => 'iii', + 'jjj' => 'hhh', + 'kkk' => 'ggg', + 'lll' => 'fff', + 'mmm' => 'eee', + 'nnn' => 'ddd', + 'ooo' => 'ccc', + 'ppp' => 'bbb', + 'qqq' => 'aaa', ]; foreach ($menus as $machine_name => $label) { @@ -155,39 +160,68 @@ public function testMenuSorting() { } $expected = [ - 0 => '/admin/structure/menu/manage/lll', - 1 => '/admin/structure/menu/manage/lll/add', - 2 => '/admin/structure/menu/manage/lll/delete', + 0 => '/admin/structure/menu/manage/qqq', + 1 => '/admin/structure/menu/manage/qqq/add', + 2 => '/admin/structure/menu/manage/qqq/delete', 3 => '/admin/structure/menu/manage/admin', 4 => '/admin/structure/menu/manage/admin/add', - 5 => '/admin/structure/menu/manage/kkk', - 6 => '/admin/structure/menu/manage/kkk/add', - 7 => '/admin/structure/menu/manage/kkk/delete', - 8 => '/admin/structure/menu/manage/jjj', - 9 => '/admin/structure/menu/manage/jjj/add', - 10 => '/admin/structure/menu/manage/jjj/delete', - 11 => '/admin/structure/menu/manage/iii', - 12 => '/admin/structure/menu/manage/iii/add', - 13 => '/admin/structure/menu/manage/iii/delete', - 14 => '/admin/structure/menu/manage/hhh', - 15 => '/admin/structure/menu/manage/hhh/add', - 16 => '/admin/structure/menu/manage/hhh/delete', - 17 => '/admin/structure/menu/manage/ggg', - 18 => '/admin/structure/menu/manage/ggg/add', - 19 => '/admin/structure/menu/manage/ggg/delete', + 5 => '/admin/structure/menu/manage/ppp', + 6 => '/admin/structure/menu/manage/ppp/add', + 7 => '/admin/structure/menu/manage/ppp/delete', + 8 => '/admin/structure/menu/manage/ooo', + 9 => '/admin/structure/menu/manage/ooo/add', + 10 => '/admin/structure/menu/manage/ooo/delete', + 11 => '/admin/structure/menu/manage/nnn', + 12 => '/admin/structure/menu/manage/nnn/add', + 13 => '/admin/structure/menu/manage/nnn/delete', + 14 => '/admin/structure/menu/manage/mmm', + 15 => '/admin/structure/menu/manage/mmm/add', + 16 => '/admin/structure/menu/manage/mmm/delete', + 17 => '/admin/structure/menu/manage/lll', + 18 => '/admin/structure/menu/manage/lll/add', + 19 => '/admin/structure/menu/manage/lll/delete', 20 => '/admin/structure/menu/manage/footer', 21 => '/admin/structure/menu/manage/footer/add', - 22 => '/admin/structure/menu/manage/fff', - 23 => '/admin/structure/menu/manage/fff/add', - 24 => '/admin/structure/menu/manage/fff/delete', - 25 => '/admin/structure/menu/manage/eee', - 26 => '/admin/structure/menu/manage/eee/add', - 27 => '/admin/structure/menu/manage/eee/delete', + 22 => '/admin/structure/menu/manage/kkk', + 23 => '/admin/structure/menu/manage/kkk/add', + 24 => '/admin/structure/menu/manage/kkk/delete', + 25 => '/admin/structure/menu/manage/jjj', + 26 => '/admin/structure/menu/manage/jjj/add', + 27 => '/admin/structure/menu/manage/jjj/delete', + 28 => '/admin/structure/menu/manage/iii', + 29 => '/admin/structure/menu/manage/iii/add', + 30 => '/admin/structure/menu/manage/iii/delete', + 31 => '/admin/structure/menu/manage/hhh', + 32 => '/admin/structure/menu/manage/hhh/add', + 33 => '/admin/structure/menu/manage/hhh/delete', + 34 => '/admin/structure/menu/manage/ggg', + 35 => '/admin/structure/menu/manage/ggg/add', + 36 => '/admin/structure/menu/manage/ggg/delete', + 37 => '/admin/structure/menu/manage/fff', + 38 => '/admin/structure/menu/manage/fff/add', + 39 => '/admin/structure/menu/manage/fff/delete', + 40 => '/admin/structure/menu/manage/main', + 41 => '/admin/structure/menu/manage/main/add', + 42 => '/admin/structure/menu/manage/eee', + 43 => '/admin/structure/menu/manage/eee/add', + 44 => '/admin/structure/menu/manage/eee/delete', + 45 => '/admin/structure/menu/manage/ddd', + 46 => '/admin/structure/menu/manage/ddd/add', + 47 => '/admin/structure/menu/manage/ddd/delete', + 48 => '/admin/structure/menu/manage/ccc', + 49 => '/admin/structure/menu/manage/ccc/add', + 50 => '/admin/structure/menu/manage/ccc/delete', + 51 => '/admin/structure/menu/manage/bbb', + 52 => '/admin/structure/menu/manage/bbb/add', + 53 => '/admin/structure/menu/manage/bbb/delete', + 54 => '/admin/structure/menu/manage/aaa', + 55 => '/admin/structure/menu/manage/aaa/add', + 56 => '/admin/structure/menu/manage/aaa/delete', ]; foreach ($links as $key => $link) { // Using assert contains because prefaces the urls with "/subdirectory". - $this->assertContains($expected[$key], $link); + $this->assertStringContainsString($expected[$key], $link); } } -- GitLab