Commit 7ce6ea53 authored by Lee Rowlands's avatar Lee Rowlands Committed by Chris Snyder
Browse files

Issue #3261893 by larowlan: Don't attach the library etc if there are no...

Issue #3261893 by larowlan: Don't attach the library etc if there are no active alerts and auto-refresh is disabled
parent 52e72c2a
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
 * Contains sitewide_alert.module.
 */

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Render\Element;
use Drupal\Core\Routing\RouteMatchInterface;

@@ -87,14 +88,24 @@ function sitewide_alert_theme_suggestions_sitewide_alert(array $variables) {
 * Implements hook_page_top().
 */
function sitewide_alert_page_top(array &$page_top) {

  // Do not show alert on admin pages if we are not configured to do so.
  if (\Drupal::service('router.admin_context')->isAdminRoute() &&
    !\Drupal::config('sitewide_alert.settings')->get('show_on_admin')) {
  // Do not show alert on admin pages if we are not configured to do so - OR -
  // don't show if automatic refresh is disabled and there are no active alerts.
  // Return an empty build with cache-metadata to force it to invalidate when
  // settings change or a new alert is saved.
  $sitewide_settings = \Drupal::config('sitewide_alert.settings');
  $cache = CacheableMetadata::createFromObject($sitewide_settings);
  $cache->addCacheTags(['sitewide_alert_list'])
    ->addCacheContexts(['languages']);
  if ((\Drupal::service('router.admin_context')->isAdminRoute() &&
    !$sitewide_settings->get('show_on_admin')) ||
    (!$sitewide_settings->get('automatic_refresh') && !\Drupal::service('sitewide_alert.sitewide_alert_manager')->activeVisibleSitewideAlerts())) {
    $build = [];
    $cache->applyTo($build);
    $page_top['sitewide_alert'] = $build;
    return;
  }

  $page_top['sitewide_alert'] = [
  $build = [
    '#markup' => '<div id="sitewide-alert"></div>',
    '#attached' => [
      'library' => [
@@ -102,10 +113,12 @@ function sitewide_alert_page_top(array &$page_top) {
      ],
      'drupalSettings' => [
        'sitewideAlert' => [
          'refreshInterval' => (\Drupal::config('sitewide_alert.settings')->get('refresh_interval') ?? 15) * 1000,
          'automaticRefresh' => (\Drupal::config('sitewide_alert.settings')->get('automatic_refresh') == 1),
          'refreshInterval' => ($sitewide_settings->get('refresh_interval') ?? 15) * 1000,
          'automaticRefresh' => ($sitewide_settings->get('automatic_refresh') == 1),
        ],
      ],
    ],
  ];
  $cache->applyTo($build);
  $page_top['sitewide_alert'] = $build;
}
+63 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\sitewide_alert\Functional;

use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\sitewide_alert\Traits\SitewideAlertTestTrait;

/**
 * Defines a class for testing site-wide alert functionality.
 *
 * @group sitewide_alert
 */
final class SitewideAlertTest extends BrowserTestBase {

  use SitewideAlertTestTrait;

  /**
   * {@inheritdoc}
   */
  public static $modules = ['sitewide_alert'];

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * Tests loading of alerts without auto-refresh.
   *
   * Tests that if there aren't active alerts and auto-refresh is off, nothing
   * loads.
   */
  public function testAlertsNotLoadedIfNonActiveAndAutoRefreshDisabled(): void {
    $this->drupalGet('');
    $assert = $this->assertSession();
    $assert->elementExists('css', '#sitewide-alert');

    \Drupal::configFactory()->getEditable('sitewide_alert.settings')->set('automatic_refresh', FALSE)->save();
    $this->drupalGet('');
    $assert->elementNotExists('css', '#sitewide-alert');

    $this->createSiteWideAlert();
    $this->drupalGet('');
    $assert->elementExists('css', '#sitewide-alert');
  }

  /**
   * Tests visibility on admin pages.
   */
  public function testAlertsNotShownOnAdminPages(): void {
    $this->drupalLogin($this->createUser([], NULL, TRUE));
    $this->drupalGet('/admin/config');
    $assert = $this->assertSession();
    $assert->elementNotExists('css', '#sitewide-alert');

    \Drupal::configFactory()->getEditable('sitewide_alert.settings')->set('show_on_admin', TRUE)->save();
    $this->drupalGet('/admin/config');
    $assert->elementExists('css', '#sitewide-alert');
  }

}