Issue #2719797 by claudiu.cristea, dww, pfrenssen, smustgrave, saurabh-2k17, esolitos, swentel, sulfikar_s, lauriii, ayushmishra206, rajneeshb, aleevas, fago, Daniel Korte, snehalgaikwad, xjm, Ruchi Joshi, alexpott, arunkumark, mitthukumawat, gaurav-mathur, gayatri chahar, heni_deepak, yoroy, dawehner, jungle, kristiaanvandeneynde, Lendude, benjifisher, quietone, Bojhan, catch: New option for Views page displays to use the admin theme
parent
100aaec107
commit
4dbf3f46c1
|
@ -68,6 +68,10 @@ views.display.page:
|
||||||
menu_name:
|
menu_name:
|
||||||
type: string
|
type: string
|
||||||
label: 'Menu name'
|
label: 'Menu name'
|
||||||
|
use_admin_theme:
|
||||||
|
type: boolean
|
||||||
|
nullable: true
|
||||||
|
label: 'Use the administration theme when rendering the view page'
|
||||||
|
|
||||||
views.display.block:
|
views.display.block:
|
||||||
type: views_display
|
type: views_display
|
||||||
|
|
|
@ -105,6 +105,10 @@ class Page extends PathPluginBase {
|
||||||
// Explicitly set HTML as the format for Page displays.
|
// Explicitly set HTML as the format for Page displays.
|
||||||
$route->setRequirement('_format', 'html');
|
$route->setRequirement('_format', 'html');
|
||||||
|
|
||||||
|
if ($this->getOption('use_admin_theme')) {
|
||||||
|
$route->setOption('_admin_route', TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
return $route;
|
return $route;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,6 +248,26 @@ class Page extends PathPluginBase {
|
||||||
$options['menu']['setting'] = $this->t('Parent menu link');
|
$options['menu']['setting'] = $this->t('Parent menu link');
|
||||||
$options['menu']['links']['tab_options'] = $this->t('Change settings for the parent menu');
|
$options['menu']['links']['tab_options'] = $this->t('Change settings for the parent menu');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the display path starts with 'admin/' the page will be rendered with
|
||||||
|
// the Administration theme regardless of the 'use_admin_theme' option
|
||||||
|
// therefore, we need to set the summary message to reflect this.
|
||||||
|
if (str_starts_with($this->getOption('path') ?? '', 'admin/')) {
|
||||||
|
$admin_theme_text = $this->t('Yes (admin path)');
|
||||||
|
}
|
||||||
|
elseif ($this->getOption('use_admin_theme')) {
|
||||||
|
$admin_theme_text = $this->t('Yes');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$admin_theme_text = $this->t('No');
|
||||||
|
}
|
||||||
|
|
||||||
|
$options['use_admin_theme'] = [
|
||||||
|
'category' => 'page',
|
||||||
|
'title' => $this->t('Administration theme'),
|
||||||
|
'value' => $admin_theme_text,
|
||||||
|
'desc' => $this->t('Use the administration theme when rendering this display.'),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -445,6 +469,20 @@ class Page extends PathPluginBase {
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'use_admin_theme':
|
||||||
|
$form['#title'] .= $this->t('Administration theme');
|
||||||
|
$form['use_admin_theme'] = [
|
||||||
|
'#type' => 'checkbox',
|
||||||
|
'#title' => $this->t('Use the administration theme'),
|
||||||
|
'#default_value' => $this->getOption('use_admin_theme'),
|
||||||
|
];
|
||||||
|
if (str_starts_with($this->getOption('path') ?? '', 'admin/')) {
|
||||||
|
$form['use_admin_theme']['#description'] = $this->t('Paths starting with "@admin" always use the administration theme.', ['@admin' => 'admin/']);
|
||||||
|
$form['use_admin_theme']['#default_value'] = TRUE;
|
||||||
|
$form['use_admin_theme']['#attributes'] = ['disabled' => 'disabled'];
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,6 +533,16 @@ class Page extends PathPluginBase {
|
||||||
case 'tab_options':
|
case 'tab_options':
|
||||||
$this->setOption('tab_options', $form_state->getValue('tab_options'));
|
$this->setOption('tab_options', $form_state->getValue('tab_options'));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'use_admin_theme':
|
||||||
|
if ($form_state->getValue('use_admin_theme')) {
|
||||||
|
$this->setOption('use_admin_theme', $form_state->getValue('use_admin_theme'));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unset($this->options['use_admin_theme']);
|
||||||
|
unset($this->display['display_options']['use_admin_theme']);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,37 @@ class DisplayPageWebTest extends ViewTestBase {
|
||||||
$this->assertPagePath('☺');
|
$this->assertPagePath('☺');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the 'use_admin_theme' page display option.
|
||||||
|
*/
|
||||||
|
public function testAdminTheme(): void {
|
||||||
|
$account = $this->drupalCreateUser(['view the administration theme']);
|
||||||
|
$this->drupalLogin($account);
|
||||||
|
// Use distinct default and administrative themes for this test.
|
||||||
|
/** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
|
||||||
|
$theme_handler = $this->container->get('theme_handler');
|
||||||
|
/** @var \Drupal\Core\Extension\ThemeInstallerInterface $theme_installer */
|
||||||
|
$theme_installer = $this->container->get('theme_installer');
|
||||||
|
$theme_installer->install(['claro']);
|
||||||
|
$this->container->get('config.factory')
|
||||||
|
->getEditable('system.theme')
|
||||||
|
->set('admin', 'claro')
|
||||||
|
->set('default', 'stable')
|
||||||
|
->save();
|
||||||
|
$theme_handler->refreshInfo();
|
||||||
|
// Check that the page has been served with the default theme.
|
||||||
|
$this->drupalGet('test_page_display_200');
|
||||||
|
$this->assertSession()->responseNotContains('core/themes/claro/css/base/elements.css');
|
||||||
|
|
||||||
|
$view = $this->config('views.view.test_page_display');
|
||||||
|
$view->set('display.page_3.display_options.use_admin_theme', TRUE)->save();
|
||||||
|
$this->container->get('router.builder')->rebuild();
|
||||||
|
|
||||||
|
// Check that the page was served with the administrative theme.
|
||||||
|
$this->drupalGet('test_page_display_200');
|
||||||
|
$this->assertSession()->responseContains('core/themes/claro/css/base/elements.css');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that we can successfully change a view page display path.
|
* Tests that we can successfully change a view page display path.
|
||||||
*
|
*
|
||||||
|
|
|
@ -4,6 +4,7 @@ namespace Drupal\Tests\views_ui\Functional;
|
||||||
|
|
||||||
use Drupal\Core\Menu\MenuTreeParameters;
|
use Drupal\Core\Menu\MenuTreeParameters;
|
||||||
use Drupal\menu_link_content\Entity\MenuLinkContent;
|
use Drupal\menu_link_content\Entity\MenuLinkContent;
|
||||||
|
use Drupal\Tests\SchemaCheckTestTrait;
|
||||||
use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
|
use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -15,6 +16,7 @@ use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
|
||||||
class DisplayPathTest extends UITestBase {
|
class DisplayPathTest extends UITestBase {
|
||||||
|
|
||||||
use AssertPageCacheContextsAndTagsTrait;
|
use AssertPageCacheContextsAndTagsTrait;
|
||||||
|
use SchemaCheckTestTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
|
@ -286,4 +288,56 @@ class DisplayPathTest extends UITestBase {
|
||||||
$this->assertSession()->statusCodeEquals(200);
|
$this->assertSession()->statusCodeEquals(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the "Use the administration theme" configuration.
|
||||||
|
*
|
||||||
|
* @see \Drupal\Tests\views\Functional\Plugin\DisplayPageWebTest::testAdminTheme
|
||||||
|
*/
|
||||||
|
public function testUseAdminTheme(): void {
|
||||||
|
$this->drupalGet('admin/structure/views/view/test_view');
|
||||||
|
|
||||||
|
// Add a new page display.
|
||||||
|
$this->submitForm([], 'Add Page');
|
||||||
|
$this->assertSession()->pageTextContains('No path is set');
|
||||||
|
$this->assertSession()->pageTextContains('Administration theme: No');
|
||||||
|
|
||||||
|
// Test with a path starting with "/admin".
|
||||||
|
$admin_path = 'admin/test_admin_path';
|
||||||
|
$this->drupalGet('admin/structure/views/nojs/display/test_view/page_1/path');
|
||||||
|
$this->submitForm(['path' => $admin_path], 'Apply');
|
||||||
|
$this->assertSession()->pageTextContains('/' . $admin_path);
|
||||||
|
$this->assertSession()->pageTextContains('Administration theme: Yes (admin path)');
|
||||||
|
$this->submitForm([], 'Save');
|
||||||
|
|
||||||
|
$this->assertConfigSchemaByName('views.view.test_view');
|
||||||
|
$display_options = $this->config('views.view.test_view')->get('display.page_1.display_options');
|
||||||
|
$this->assertArrayNotHasKey('use_admin_theme', $display_options);
|
||||||
|
|
||||||
|
$this->drupalGet('admin/structure/views/nojs/display/test_view/page_1/use_admin_theme');
|
||||||
|
$this->assertSession()->elementExists('css', 'input[name="use_admin_theme"][disabled="disabled"][checked="checked"]');
|
||||||
|
|
||||||
|
// Test with a non-administration path.
|
||||||
|
$non_admin_path = 'kittens';
|
||||||
|
$this->drupalGet('admin/structure/views/nojs/display/test_view/page_1/path');
|
||||||
|
$this->submitForm(['path' => $non_admin_path], 'Apply');
|
||||||
|
$this->assertSession()->pageTextContains('/' . $non_admin_path);
|
||||||
|
$this->assertSession()->pageTextContains('Administration theme: No');
|
||||||
|
$this->submitForm([], 'Save');
|
||||||
|
|
||||||
|
$this->assertConfigSchemaByName('views.view.test_view');
|
||||||
|
$display_options = $this->config('views.view.test_view')->get('display.page_1.display_options');
|
||||||
|
$this->assertArrayNotHasKey('use_admin_theme', $display_options);
|
||||||
|
|
||||||
|
// Enable administration theme.
|
||||||
|
$this->drupalGet('admin/structure/views/nojs/display/test_view/page_1/use_admin_theme');
|
||||||
|
$this->submitForm(['use_admin_theme' => TRUE], 'Apply');
|
||||||
|
$this->assertSession()->pageTextContains('Administration theme: Yes');
|
||||||
|
$this->submitForm([], 'Save');
|
||||||
|
|
||||||
|
$this->assertConfigSchemaByName('views.view.test_view');
|
||||||
|
$display_options = $this->config('views.view.test_view')->get('display.page_1.display_options');
|
||||||
|
$this->assertArrayHasKey('use_admin_theme', $display_options);
|
||||||
|
$this->assertTrue($display_options['use_admin_theme']);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue