From f341fd00c5b735c9c31c3cda657c6afc6a1fcab3 Mon Sep 17 00:00:00 2001
From: catch <6915-catch@users.noreply.drupalcode.org>
Date: Mon, 25 Nov 2024 18:32:44 +0000
Subject: [PATCH] Issue #3488768 by plopesc, m4olivei, atul_ghate: Menu blocks
 specific to Navigation are leaking into the Block layout UI

---
 .../navigation/src/Hook/NavigationHooks.php   | 23 +++++++++----------
 .../NavigationSafeBlockDefinitionTest.php     | 17 +++++++++++++-
 2 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/core/modules/navigation/src/Hook/NavigationHooks.php b/core/modules/navigation/src/Hook/NavigationHooks.php
index 9faf932e3251..71b9a40791a0 100644
--- a/core/modules/navigation/src/Hook/NavigationHooks.php
+++ b/core/modules/navigation/src/Hook/NavigationHooks.php
@@ -154,27 +154,26 @@ public function pluginFilterLayoutLayoutBuilderAlter(array &$definitions, array
    */
   #[Hook('block_alter')]
   public function blockAlter(&$definitions) : void {
-    // Hide Navigation specific blocks from the generic UI.
-    $hidden = ['navigation_user', 'navigation_shortcuts', 'navigation_menu', 'navigation_link'];
-    foreach ($hidden as $block_id) {
-      if (isset($definitions[$block_id])) {
-        $definitions[$block_id]['_block_ui_hidden'] = TRUE;
-      }
-    }
-
-    // Add the allow_in_navigation attribute to those blocks valid for Navigation.
-    // @todo Refactor to use actual block Attribute once
-    //   https://www.drupal.org/project/drupal/issues/3443882 is merged.
     array_walk($definitions, function (&$definition, $block_id) {
+      [$base_plugin_id] = explode(PluginBase::DERIVATIVE_SEPARATOR, $block_id);
+
+      // Add the allow_in_navigation attribute to those blocks valid for Navigation.
+      // @todo Refactor to use actual block Attribute once
+      //   https://www.drupal.org/project/drupal/issues/3443882 is merged.
       $allow_in_navigation = [
         'navigation_user',
         'navigation_shortcuts',
         'navigation_menu',
       ];
-      [$base_plugin_id] = explode(PluginBase::DERIVATIVE_SEPARATOR, $block_id);
       if (in_array($base_plugin_id, $allow_in_navigation, TRUE)) {
         $definition['allow_in_navigation'] = TRUE;
       }
+
+      // Hide Navigation specific blocks from the generic UI.
+      $hidden = ['navigation_user', 'navigation_shortcuts', 'navigation_menu', 'navigation_link'];
+      if (in_array($base_plugin_id, $hidden, TRUE)) {
+        $definition['_block_ui_hidden'] = TRUE;
+      }
     });
   }
 
diff --git a/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php b/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php
index 5a9c85f8f98f..2f0ab834a27d 100644
--- a/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php
+++ b/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php
@@ -16,7 +16,7 @@ class NavigationSafeBlockDefinitionTest extends BrowserTestBase {
   /**
    * {@inheritdoc}
    */
-  protected static $modules = ['navigation', 'navigation_test'];
+  protected static $modules = ['navigation', 'navigation_test', 'block'];
 
   /**
    * {@inheritdoc}
@@ -40,6 +40,7 @@ protected function setUp(): void {
     $this->adminUser = $this->drupalCreateUser([
       'configure navigation layout',
       'access navigation',
+      'administer blocks',
     ]);
 
     $this->drupalLogin($this->adminUser);
@@ -73,4 +74,18 @@ public function testNavigationSafeBlockDefinition(): void {
     $this->assertSession()->linkNotExists('Navigation Shortcuts');
   }
 
+  /**
+   * Tests logic to exclude blocks in Block Layout UI.
+   */
+  public function testNavigationBlocksHiddenInBlockLayout(): void {
+    $block_url = '/admin/structure/block';
+    $this->drupalGet($block_url);
+    $this->clickLink('Place block');
+    $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_menu%3Aadmin/stark');
+    $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_menu%3Acontent/stark');
+    $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_shortcuts/stark');
+    $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_user/stark');
+    $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_link/stark');
+  }
+
 }
-- 
GitLab