diff --git a/core/modules/outside_in/outside_in.module b/core/modules/outside_in/outside_in.module index a7fab7b..147b824 100644 --- a/core/modules/outside_in/outside_in.module +++ b/core/modules/outside_in/outside_in.module @@ -34,6 +34,11 @@ function outside_in_help($route_name, RouteMatchInterface $route_match) { */ function outside_in_contextual_links_view_alter(&$element, $items) { if (isset($element['#links']['outside-inblock-configure'])) { + if (!empty($element['#contextual_links']['block']['metadata']['remove_outside_in'])) { + unset($element['#links']['outside-inblock-configure']); + unset($items['outside_in.block_configure']); + return; + } $element['#links']['outside-inblock-configure']['attributes'] = [ 'class' => ['use-ajax'], 'data-dialog-type' => 'dialog', @@ -55,6 +60,12 @@ function outside_in_block_view_alter(array &$build) { $build['#contextual_links']['outside_in'] = [ 'route_parameters' => [], ]; + if (!\Drupal::service('outside_in.manager')->isBlockEditable($build['#plugin_id']) && isset($build['#contextual_links']['block'])) { + // If this block should not be editable flag for contextual link removable. + // The individual links are not available here to remove. + $build['#contextual_links']['block']['metadata']['remove_outside_in'] = TRUE; + } + } /** @@ -93,7 +104,9 @@ function outside_in_entity_type_build(array &$entity_types) { function outside_in_preprocess_block(&$variables) { // The main system block does not contain the block contextual links. $variables['#cache']['contexts'][] = 'outside_in_is_applied'; - if ($variables['plugin_id'] !== 'system_main_block' && \Drupal::service('outside_in.manager')->isApplicable()) { + /** @var \Drupal\outside_in\OutsideInManagerInterface $outside_in_manager */ + $outside_in_manager = \Drupal::service('outside_in.manager'); + if ($outside_in_manager->isBlockEditable($variables['plugin_id']) && $outside_in_manager->isApplicable()) { // Add class and attributes to all blocks to allow Javascript to target. $variables['attributes']['class'][] = 'outside-in-editable'; $variables['attributes']['data-drupal-outsidein'] = 'editable'; diff --git a/core/modules/outside_in/src/OutsideInManager.php b/core/modules/outside_in/src/OutsideInManager.php index 666a938..6549e2a 100644 --- a/core/modules/outside_in/src/OutsideInManager.php +++ b/core/modules/outside_in/src/OutsideInManager.php @@ -63,4 +63,12 @@ public function isApplicable() { return $this->account->hasPermission('administer blocks') && !$is_admin_route && !$is_admin_demo_route; } + /** + * {@inheritdoc} + */ + public function isBlockEditable($plugin_id) { + $non_editable_blocks = ['page_title_block', 'system_main_block']; + return !in_array($plugin_id, $non_editable_blocks); + } + } diff --git a/core/modules/outside_in/src/OutsideInManagerInterface.php b/core/modules/outside_in/src/OutsideInManagerInterface.php index 684adb3..0cfc70c 100644 --- a/core/modules/outside_in/src/OutsideInManagerInterface.php +++ b/core/modules/outside_in/src/OutsideInManagerInterface.php @@ -15,4 +15,15 @@ */ public function isApplicable(); + /** + * Checks whether a block should be covered by this module. + * + * @param string $plugin_id + * The plugin id for the block to check. + * + * @return bool + * TRUE if the block should the "Quick Edit" link provided by this module. + */ + public function isBlockEditable($plugin_id); + }