Issue #665790 by chrisrockwell, Sumit kumar, lauriii, joelpittet, sun, vulcanr, vaplas, yoroy, leahtard, tompagabor, aspilicious, ckrina, Gábor Hojtsy, David_Rothstein, Manuel Garcia, rootwork, nod_, kostyashupenko, pguillard, Bojhan, droplet, typhonius, wturrell, mgifford, webkenny, cosmicdreams, tkoleary, YesCT, marcvangend, markabur, LewisNyman, mrfelton, oriol_e9g, prabhu9484, catch, hedrickbt, tsvenson, longwave, dww, kika, borisson_, rdellis87, realityloop, klonos: Redesign the status report page

8.4.x
webchick 2017-02-07 12:44:09 -08:00
parent 90ba2d40c7
commit 38b3dd1072
48 changed files with 1561 additions and 117 deletions

View File

@ -2158,7 +2158,7 @@ function install_display_requirements($install_state, $requirements) {
// and indicating a desire to continue anyway. See drupal_requirements_url().
if ($severity == REQUIREMENT_ERROR || ($severity == REQUIREMENT_WARNING && empty($install_state['parameters']['continue']))) {
if ($install_state['interactive']) {
$build['report']['#theme'] = 'status_report';
$build['report']['#type'] = 'status_report';
$build['report']['#requirements'] = $requirements;
if ($severity == REQUIREMENT_WARNING) {
$build['#title'] = t('Requirements review');

View File

@ -0,0 +1,89 @@
<?php
namespace Drupal\Core\Render\Element;
/**
* Creates status report page element.
*
* @RenderElement("status_report")
*/
class StatusReport extends RenderElement {
/**
* {@inheritdoc}
*/
public function getInfo() {
$class = get_class($this);
return [
'#theme' => 'status_report_grouped',
'#priorities' => [
'error',
'warning',
'checked',
'ok',
],
'#pre_render' => [
[$class, 'preRenderGroupRequirements'],
],
];
}
/**
* #pre_render callback to group requirements.
*/
public static function preRenderGroupRequirements($element) {
$severities = static::getSeverities();
$grouped_requirements = [];
foreach ($element['#requirements'] as $key => $requirement) {
$severity = $severities[REQUIREMENT_INFO];
if (isset($requirement['severity'])) {
$requirement_severity = (int) $requirement['severity'] === REQUIREMENT_OK ? REQUIREMENT_INFO : (int) $requirement['severity'];
$severity = $severities[$requirement_severity];
}
elseif (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'install') {
$severity = $severities[REQUIREMENT_OK];
}
$grouped_requirements[$severity['status']]['title'] = $severity['title'];
$grouped_requirements[$severity['status']]['type'] = $severity['status'];
$grouped_requirements[$severity['status']]['items'][$key] = $requirement;
}
// Order the grouped requirements by a set order.
$order = array_flip($element['#priorities']);
uksort($grouped_requirements, function ($a, $b) use ($order) {
return $order[$a] > $order[$b];
});
$element['#grouped_requirements'] = $grouped_requirements;
return $element;
}
/**
* Gets the severities.
*
* @return array
*/
public static function getSeverities() {
return [
REQUIREMENT_INFO => [
'title' => t('Checked'),
'status' => 'checked',
],
REQUIREMENT_OK => [
'title' => t('OK'),
'status' => 'ok',
],
REQUIREMENT_WARNING => [
'title' => t('Warnings found'),
'status' => 'warning',
],
REQUIREMENT_ERROR => [
'title' => t('Errors found'),
'status' => 'error',
],
];
}
}

View File

@ -35,7 +35,7 @@ class ContentTranslationEnableTest extends WebTestBase {
// No pending updates should be available.
$this->drupalGet('admin/reports/status');
$requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td");
$requirement_value = $this->cssSelect("details.system-status-report__entry summary:contains('Entity/field definitions') + div");
$this->assertEqual(t('Up to date'), trim((string) $requirement_value[0]));
$this->drupalGet('admin/config/regional/content-language');
@ -53,7 +53,7 @@ class ContentTranslationEnableTest extends WebTestBase {
// No pending updates should be available.
$this->drupalGet('admin/reports/status');
$requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td");
$requirement_value = $this->cssSelect("details.system-status-report__entry summary:contains('Entity/field definitions') + div");
$this->assertEqual(t('Up to date'), trim((string) $requirement_value[0]));
// Create a node type and check the content translation settings are now

View File

@ -0,0 +1,30 @@
/**
* @file
* Styles for the system status counter component.
*/
.system-status-counter__status-icon {
display: inline-block;
height: 25px;
width: 25px;
vertical-align: middle;
}
.system-status-counter__status-icon:before {
content: "";
background-size: 16px;
background-position: center 2px;
background-repeat: no-repeat;
width: 100%;
height: 100%;
display: block;
}
.system-status-counter__status-icon--error:before {
background-image: url(../../../../misc/icons/e32700/error.svg);
}
.system-status-counter__status-icon--warning:before {
background-image: url(../../../../misc/icons/e29700/warning.svg);
}
.system-status-counter__status-icon--checked:before {
background-image: url(../../../../misc/icons/73b355/check.svg);
}

View File

@ -0,0 +1,27 @@
/**
* @file
* Styles for the system status report counters.
*/
.system-status-report-counters__item {
width: 100%;
padding: .5em 0;
text-align: center;
white-space: nowrap;
background-color: rgba(0, 0, 0, 0.063);
margin-bottom: .5em;
}
@media screen and (min-width: 60em) {
.system-status-report-counters {
flex-wrap: wrap;
display: flex;
justify-content: space-between;
}
.system-status-report-counters__item--half-width {
width: 49%;
}
.system-status-report-counters__item--third-width {
width: 33%;
}
}

View File

@ -0,0 +1,14 @@
/**
* @file
* Default styles for the System Status general info.
*/
.system-status-general-info__item {
border: 1px solid #ccc;
margin-top: 1em;
padding: 0 1em 1em;
}
.system-status-general-info__item-title {
border-bottom: 1px solid #ccc;
}

View File

@ -204,10 +204,11 @@ small .admin-link:after {
.system-status-report__status-title {
position: relative;
vertical-align: top;
width: 25%;
width: 100%;
padding: 10px 6px 10px 40px; /* LTR */
box-sizing: border-box;
font-weight: normal;
background-color: transparent;
}
[dir="rtl"] .system-status-report__status-title {
padding: 10px 40px 10px 6px;
@ -232,6 +233,9 @@ small .admin-link:after {
.system-status-report__status-icon--warning:before {
background-image: url(../../../misc/icons/e29700/warning.svg);
}
.system-status-report__entry__value {
padding: 1em .5em;
}
/**
* Appearance page.
@ -387,3 +391,6 @@ small .admin-link:after {
[dir="rtl"] .system-themes-admin-form {
clear: right;
}
.cron-description__run-cron {
display: block;
}

View File

@ -522,7 +522,7 @@ class DbUpdateController extends ControllerBase {
$try_again_url = Url::fromUri($request->getUriForPath(''))->setOptions(['query' => $options])->toString(TRUE)->getGeneratedUrl();
$build['status_report'] = array(
'#theme' => 'status_report',
'#type' => 'status_report',
'#requirements' => $requirements,
'#suffix' => $this->t('Check the messages and <a href=":url">try again</a>.', array(':url' => $try_again_url))
);

View File

@ -47,7 +47,7 @@ class SystemInfoController implements ContainerInjectionInterface {
*/
public function status() {
$requirements = $this->systemManager->listRequirements();
return array('#theme' => 'status_report', '#requirements' => $requirements);
return ['#type' => 'status_report_page', '#requirements' => $requirements];
}
/**

View File

@ -0,0 +1,139 @@
<?php
namespace Drupal\system\Element;
use Drupal\Core\Render\Element\RenderElement;
use Drupal\Core\Render\Element\StatusReport;
use Drupal\Core\StringTranslation\PluralTranslatableMarkup;
/**
* Creates status report page element.
*
* @RenderElement("status_report_page")
*/
class StatusReportPage extends RenderElement {
/**
* {@inheritdoc}
*/
public function getInfo() {
$class = get_class($this);
return [
'#theme' => 'status_report_page',
'#pre_render' => [
[$class, 'preRenderCounters'],
[$class, 'preRenderGeneralInfo'],
[$class, 'preRenderRequirements'],
],
];
}
/**
* #pre_render callback to get general info out of requirements.
*/
public static function preRenderGeneralInfo($element) {
$element['#general_info'] = [
'#theme' => 'status_report_general_info',
];
// Loop through requirements and pull out items.
foreach ($element['#requirements'] as $key => $requirement) {
switch ($key) {
case 'cron':
foreach ($requirement['description'] as &$description_elements) {
foreach ($description_elements as &$description_element) {
if (isset($description_element['#url']) && $description_element['#url']->getRouteName() == 'system.run_cron') {
$description_element['#attributes']['class'][] = 'button';
$description_element['#attributes']['class'][] = 'button--small';
$description_element['#attributes']['class'][] = 'button--primary';
$description_element['#attributes']['class'][] = 'system-status-general-info__run-cron';
}
}
}
$element['#general_info']['#' . $key] = $requirement;
unset($element['#requirements'][$key]);
break;
case 'drupal':
case 'webserver':
case 'database_system':
case 'database_system_version':
case 'php':
case 'php_memory_limit':
$element['#general_info']['#' . $key] = $requirement;
unset($element['#requirements'][$key]);
break;
}
}
return $element;
}
/**
* #pre_render callback to create counter elements.
*/
public static function preRenderCounters($element) {
// Count number of items with different severity for summary.
$counters = [
'error' => [
'amount' => 0,
'text' => t('Error'),
'text_plural' => t('Errors'),
],
'warning' => [
'amount' => 0,
'text' => t('Warning'),
'text_plural' => t('Warnings'),
],
'checked' => [
'amount' => 0,
'text' => t('Checked'),
'text_plural' => t('Checked'),
],
];
$severities = StatusReport::getSeverities();
foreach ($element['#requirements'] as $key => &$requirement) {
$severity = $severities[REQUIREMENT_INFO];
if (isset($requirement['severity'])) {
$severity = $severities[(int) $requirement['severity']];
}
elseif (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'install') {
$severity = $severities[REQUIREMENT_OK];
}
if (isset($counters[$severity['status']])) {
$counters[$severity['status']]['amount']++;
}
}
foreach ($counters as $key => $counter) {
if ($counter['amount'] === 0) {
continue;
}
$text = new PluralTranslatableMarkup($counter['amount'], $counter['text'], $counter['text_plural']);
$element['#counters'][$key] = [
'#theme' => 'status_report_counter',
'#amount' => $counter['amount'],
'#text' => $text,
'#severity' => $key,
];
}
return $element;
}
/**
* #pre_render callback to create status report requirements.
*/
public static function preRenderRequirements($element) {
$element['#requirements'] = [
'#type' => 'status_report',
'#requirements' => $element['#requirements'],
];
return $element;
}
}

View File

@ -110,7 +110,7 @@ class SystemManager {
// Check run-time requirements and status information.
$requirements = $this->moduleHandler->invokeAll('requirements', array('runtime'));
usort($requirements, function($a, $b) {
uasort($requirements, function($a, $b) {
if (!isset($a['weight'])) {
if (!isset($b['weight'])) {
return strcasecmp($a['title'], $b['title']);

View File

@ -121,7 +121,7 @@ class CronRunTest extends WebTestBase {
$this->assertResponse(403);
$this->drupalGet('admin/reports/status');
$this->clickLink(t('run cron manually'));
$this->clickLink(t('Run cron'));
$this->assertResponse(200);
$this->assertText(t('Cron ran successfully.'));
}

View File

@ -105,66 +105,6 @@ function template_preprocess_system_admin_index(&$variables) {
}
}
/**
* Prepares variables for status report template.
*
* Default template: status-report.html.twig.
*
* This theme function is dependent on install.inc being loaded, because
* that's where the constants are defined.
*
* @param $variables
* An associative array containing:
* - requirements: An array of requirements/status items. Each requirement
* is an associative array containing the following elements:
* - title: The name of the requirement.
* - value: (optional) The current value (version, time, level, etc).
* - description: (optional) The description of the requirement.
* - severity: (optional) The requirement's result/severity level, one of:
* - REQUIREMENT_INFO: Status information.
* - REQUIREMENT_OK: The requirement is satisfied.
* - REQUIREMENT_WARNING: The requirement failed with a warning.
* - REQUIREMENT_ERROR: The requirement failed with an error.
*/
function template_preprocess_status_report(&$variables) {
$severities = array(
REQUIREMENT_INFO => array(
'title' => t('Info'),
'status' => 'info',
),
REQUIREMENT_OK => array(
'title' => t('OK'),
'status' => 'ok',
),
REQUIREMENT_WARNING => array(
'title' => t('Warning'),
'status' => 'warning',
),
REQUIREMENT_ERROR => array(
'title' => t('Error'),
'status' => 'error',
),
);
foreach ($variables['requirements'] as $i => $requirement) {
// Always use the explicit requirement severity, if defined. Otherwise,
// default to REQUIREMENT_OK in the installer to visually confirm that
// installation requirements are met. And default to REQUIREMENT_INFO to
// denote neutral information without special visualization.
if (isset($requirement['severity'])) {
$severity = $severities[(int) $requirement['severity']];
}
elseif (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'install') {
$severity = $severities[REQUIREMENT_OK];
}
else {
$severity = $severities[REQUIREMENT_INFO];
}
$variables['requirements'][$i]['severity_title'] = $severity['title'];
$variables['requirements'][$i]['severity_status'] = $severity['status'];
}
}
/**
* Prepares variables for the module details templates.
*

View File

@ -535,14 +535,20 @@ function system_requirements($phase) {
],
];
}
$cron_url = \Drupal::url('system.cron', ['key' => \Drupal::state()->get('system.cron_key'), ['absolute' => TRUE]]);
$requirements['cron']['description'][] = [
[
'#markup' => t('You can <a href=":cron">run cron manually</a>.', [':cron' => \Drupal::url('system.run_cron')]),
'#type' => 'link',
'#prefix' => '(',
'#title' => t('more information'),
'#suffix' => ')',
'#url' => Url::fromRoute('system.cron_settings'),
],
[
'#prefix' => '<br />',
'#markup' => t('To run cron from outside the site, go to <a href=":url">@cron</a>', [':url' => $cron_url, '@cron' => $cron_url]),
'#prefix' => '<span class="cron-description__run-cron">',
'#suffix' => '</span>',
'#type' => 'link',
'#title' => t('Run cron'),
'#url' => Url::fromRoute('system.run_cron'),
],
];
}

View File

@ -19,6 +19,9 @@ base:
css/components/reset-appearance.module.css: { weight: -10 }
css/components/resize.module.css: { weight: -10 }
css/components/sticky-header.module.css: { weight: -10 }
css/components/system-status-counter.css: { weight: -10 }
css/components/system-status-report-counters.css: { weight: -10 }
css/components/system-status-report-general-info.css: { weight: -10 }
css/components/tabledrag.module.css: { weight: -10 }
css/components/tablesort.module.css: { weight: -10 }
css/components/tree-child.module.css: { weight: -10 }

View File

@ -197,9 +197,38 @@ function system_theme() {
'render element' => 'form',
'file' => 'system.admin.inc',
),
'status_report_page' => array(
'variables' => array(
'counters' => array(),
'general_info' => array(),
'requirements' => NULL,
),
),
'status_report' => array(
'variables' => array('requirements' => NULL),
'file' => 'system.admin.inc',
'variables' => array(
'grouped_requirements' => NULL,
'requirements' => NULL,
),
),
'status_report_grouped' => array(
'variables' => array(
'grouped_requirements' => NULL,
'requirements' => NULL,
),
),
'status_report_counter' => array(
'variables' => array('amount' => NULL, 'text' => NULL, 'severity' => NULL),
),
'status_report_general_info' => array(
'variables' => array(
'drupal' => array(),
'cron' => array(),
'database_system' => array(),
'database_system_version' => array(),
'php' => array(),
'php_memory_limit' => array(),
'webserver' => array(),
),
),
'admin_page' => array(
'variables' => array('blocks' => NULL),

View File

@ -0,0 +1,16 @@
{#
/**
* @file
* Default theme implementation for the status report counter.
*
* Available variables:
* - amount: The number shown on counter.
* - text: The text shown on counter.
* - severity: The severity of the counter.
*
* @ingroup themable
*/
#}
<span class="system-status-counter__status-icon system-status-counter__status-icon--{{ severity }}"></span>
<span>{{ amount }} {{ text }}</span>
<a href="#{{ severity }}"><span class="visually-hidden">{{ text }} </span>Details</a>

View File

@ -0,0 +1,81 @@
{#
/**
* @file
* Default theme implementation for the status report general info.
*
* Available variables:
* - drupal: The status of Drupal installation:
* - value: The current status of Drupal installation.
* - description: The description for current status of Drupal installation.
* - cron: The status of cron:
* - value: The current status of cron.
* - description: The description for current status of cron.
* - cron.run_cron: An array to render a button for running cron.
* - database_system: The status of database system:
* - value: The current status of database sytem.
* - description: The description for current status of cron.
* - database_system_version: The info about current database version:
* - value: The current version of database.
* - description: The description for current version of database.
* - php: The current version of PHP:
* - value: The status of currently installed PHP version.
* - description: The description for current installed PHP version.
* - php_memory_limit: The info about current PHP memory limit:
* - value: The status of currently set PHP memory limit.
* - description: The description for currently set PHP memory limit.
* - webserver: The info about currently installed web server:
* - value: The status of currently installed web server.
* - description: The description for the status of currently installed web
* server.
*/
#}
<h2>{{ 'General System Information'|t }}</h2>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Drupal Version'|t }}</h3>
{{ drupal.value }}
{% if drupal.description %}
{{ drupal.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Last Cron Run'|t }}</h3>
{{ cron.value }}
{% if cron.run_cron %}
{{ cron.run_cron }}
{% endif %}
{% if cron.description %}
{{ cron.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Web Server'|t }}</h3>
{{ webserver.value }}
{% if webserver.description %}
{{ webserver.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'PHP'|t }}</h3>
<h4>{{ 'Version'|t }}</h4> {{ php.value }}
{% if php.description %}
{{ php.description }}
{% endif %}
<h4>{{ 'Memory limit'|t }}</h4>{{ php_memory_limit.value }}
{% if php_memory_limit.description %}
{{ php_memory_limit.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Database'|t }}</h3>
<h4>{{ 'Version'|t }}</h4>{{ database_system_version.value }}
{% if database_system_version.description %}
{{ database_system_version.description }}
{% endif %}
<h4>{{ 'System'|t }}</h4>{{ database_system.value }}
{% if database_system.description %}
{{ database_system.description }}
{% endif %}
</div>

View File

@ -0,0 +1,49 @@
{#
/**
* @file
* Default theme implementation of grouped status report requirements.
*
* - grouped_requirements: Contains grouped requirements.
* Each group contains:
* - title: The title of the group.
* - type: The severity of the group.
* - items: The requirement instances.
* Each requirement item contains:
* - title: The title of the requirement.
* - value: (optional) The requirement's status.
* - description: (optional) The requirement's description.
* - severity_title: The title of the severity.
* - severity_status: Indicates the severity status.
*/
#}
{{ attach_library('core/drupal.collapse') }}
<div>
{% for group in grouped_requirements %}
<div>
<h3 id="{{ group.type }}">{{ group.title }}</h3>
{% for requirement in group.items %}
<details class="system-status-report__entry">
{%
set summary_classes = [
'system-status-report__status-title',
group.type in ['warning', 'error'] ? 'system-status-report__status-icon system-status-report__status-icon--' ~ group.type
]
%}
<summary{{ create_attribute({'class': summary_classes}) }} role="button">
{% if requirement.severity_title %}
<span class="visually-hidden">{{ requirement.severity_title }}</span>
{% endif %}
{{ requirement.title }}
</summary>
<div class="system-status-report__entry__value">
{{ requirement.value }}
{% if requirement.description %}
<div class="description">{{ requirement.description }}</div>
{% endif %}
</div>
</details>
{% endfor %}
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Default theme implementation for the status report page.
*
* Available variables:
* - counters: The list of counter elements.
* - general_info: A render array to create general info element.
* - requirements: A render array to create requirements table.
*
* @see template_preprocess_status_report()
*/
#}
{% if counters|length == 3 %}
{% set element_width_class = ' system-status-report-counters__item--third-width' %}
{% elseif counters|length == 2 %}
{% set element_width_class = ' system-status-report-counters__item--half-width' %}
{% endif %}
<div class="system-status-report-counters">
{% for counter in counters %}
<div class="system-status-report-counters__item{{ element_width_class }}">
{{ counter }}
</div>
{% endfor %}
</div>
{{ general_info }}
{{ requirements }}

View File

@ -4,38 +4,36 @@
* Default theme implementation for the status report.
*
* Available variables:
* - requirements: Contains multiple requirement instances.
* Each requirement contains:
* - grouped_requirements: Contains grouped requirements.
* Each group contains:
* - title: The title of the group.
* - type: The severity of the group.
* - items: The requirement instances.
* Each requirement item contains:
* - title: The title of the requirement.
* - value: (optional) The requirement's status.
* - description: (optional) The requirement's description.
* - severity_title: The title of the severity.
* - severity_status: Indicates the severity status.
*
* @see template_preprocess_status_report()
* - requirements: Ungrouped requirements
*
* @ingroup themeable
*/
#}
<table class="system-status-report">
<tbody>
{% for requirement in requirements %}
<tr class="system-status-report__entry system-status-report__entry--{{ requirement.severity_status }} color-{{ requirement.severity_status }}">
{% if requirement.severity_status in ['warning', 'error'] %}
<th class="system-status-report__status-title system-status-report__status-icon system-status-report__status-icon--{{ requirement.severity_status }}">
#}
{% for group in grouped_requirements %}
<h3 id="{{ group.type }}">{{ group.title }}</h3>
{% for requirement in group.items %}
<details>
<summary role="button">
{% if requirement.severity_title %}
<span class="visually-hidden">{{ requirement.severity_title }}</span>
{% else %}
<th class="system-status-report__status-title">
{% endif %}
{{ requirement.title }}
</th>
<td>
</summary>
{{ requirement.value }}
{% if requirement.description %}
<div class="description">{{ requirement.description }}</div>
<div>{{ requirement.description }}</div>
{% endif %}
</td>
</tr>
</details>
{% endfor %}
</tbody>
</table>
{% endfor %}

View File

@ -0,0 +1,87 @@
/**
* @file
* Styles for the system status counter component.
*/
.system-status-counter {
box-sizing: border-box;
overflow-y: hidden;
border: 1px solid #e6e4df;
border-radius: 3px;
display: inline-block;
width: 100%;
white-space: nowrap;
background: #FCFCFA;
}
.system-status-counter__status-icon {
display: inline-block;
height: 60px;
width: 60px;
vertical-align: middle;
border-right: 1px solid #e6e4df; /* LTR */
border-left: 0; /* LTR */
background-color: #faf9f5;
box-shadow: 0 1px 1px rgba(0, 0, 0, .1) inset;
}
[dir="rtl"] .system-status-counter__status-icon {
border-right: 0;
border-left: 1px solid #e6e4df;
box-shadow: 0 1px 1px rgba(0, 0, 0, .1) inset;
}
.system-status-counter__status-icon:before {
content: "";
background-size: 25px;
background-position: 50% center;
background-repeat: no-repeat;
width: 100%;
height: 100%;
display: block;
}
.system-status-counter__status-icon--error:before {
background-image: url(../../../stable/images/core/icons/e32700/error.svg);
}
.system-status-counter__status-icon--warning:before {
background-image: url(../../../stable/images/core/icons/e29700/warning.svg);
}
.system-status-counter__status-icon--checked:before {
background-image: url(../../../stable/images/core/icons/73b355/check.svg);
}
.system-status-counter__status-title {
display: inline-block;
vertical-align: middle;
text-transform: uppercase;
padding: 0 6px;
font-size: 1rem;
line-height: 1em;
font-weight: bold;
}
.system-status-counter__title-count {
display: block;
margin-bottom: 2px;
}
.system-status-counter__details {
font-size: 12px;
font-weight: normal;
text-transform: none;
display: block;
line-height: 1.5;
}
@media screen and (min-width: 61em) {
.system-status-counter__status-icon,
.system-status-counter {
height: 65px;
}
.system-status-counter__status-icon {
width: 65px;
}
.system-status-counter__status-title {
font-size: 16px;
padding: 10px 3%;
}
.system-status-counter__status-icon:before {
background-size: 35px;
}
}

View File

@ -0,0 +1,26 @@
/**
* @file
* Styles for the system status report counters.
*/
.system-status-report-counters__item {
margin: 10px 0;
width: 100%;
}
@media screen and (min-width: 60em) {
.system-status-report-counters__item {
margin-bottom: 20px;
}
.system-status-report-counters {
flex-wrap: wrap;
display: flex;
justify-content: space-between;
}
.system-status-report-counters__item--half-width {
width: 49%;
}
.system-status-report-counters__item--third-width {
width: 32%;
}
}

View File

@ -0,0 +1,161 @@
/**
* @file
* Seven styles for the System Status general info.
*/
.system-status-general-info {
border: 1px solid #ccc;
border-radius: 3px;
}
.system-status-general-info__header {
background-color: #f5f5f2;
padding: 10px;
margin: 0;
overflow: hidden;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
font-size: 14px;
text-transform: uppercase;
}
.system-status-general-info__item {
background: #fcfcfa;
border-top: 1px solid #ccc;
padding: 10px 10px 20px;
box-sizing: border-box;
overflow-x: auto;
}
.system-status-general-info__item-icon {
display: inline-block;
height: 45px;
width: 45px;
vertical-align: top;
}
.system-status-general-info__item-icon:before {
content: "";
background-size: 35px;
background-position: 50% center;
background-repeat: no-repeat;
width: 100%;
height: 100%;
display: block;
}
.system-status-general-info__item-icon--d8:before {
background-image: url(../../images/icons/cccccc/d8-logo.svg);
}
.system-status-general-info__item-icon--clock:before {
background-image: url(../../images/icons/cccccc/clock.svg);
}
.system-status-general-info__item-icon--server:before {
background-image: url(../../images/icons/cccccc/server.svg);
}
.system-status-general-info__item-icon--php:before {
background-image: url(../../images/icons/cccccc/php-logo.svg);
background-size: 45px;
}
.system-status-general-info__item-icon--database:before {
background-image: url(../../images/icons/cccccc/database.svg);
background-size: 30px;
}
.system-status-general-info__item-details {
box-sizing: border-box;
display: inline-block;
width: calc(100% - 60px);
padding-left: 10px; /* LTR */
position: relative;
}
[dir="rtl"] .system-status-general-info__item-details {
padding-right: 10px;
padding-left: 0;
}
.system-status-general-info__item-title {
margin-bottom: 0;
}
.system-status-general-info__sub-item-title {
margin: 0;
}
.system-status-general-info__sub-item__title {
font-weight: bold;
}
.system-status-general-info__sub-item__value {
display: block;
}
.system-status-general-info__run-cron {
margin: 1em 0 0;
}
@media screen and (min-width: 48em) {
.system-status-general-info__items {
display: flex;
flex-wrap: wrap;
overflow-x: hidden;
}
.system-status-general-info__item {
flex: 1;
flex-basis: 33%;
width: 33%;
}
.system-status-general-info__item:nth-child(2) {
flex: 2;
flex-basis: 66%;
}
.system-status-general-info__item:nth-child(2),
.system-status-general-info__item:nth-child(4),
.system-status-general-info__item:nth-child(5) {
border-left: 1px solid #ccc; /* LTR */
}
[dir="rtl"] .system-status-general-info__item:nth-child(1),
[dir="rtl"] .system-status-general-info__item:nth-child(3) {
border-left: 1px solid #ccc;
}
[dir="rtl"] .system-status-general-info__item:nth-child(2),
[dir="rtl"] .system-status-general-info__item:nth-child(5) {
border-left: 0;
}
.system-status-general-info__run-cron {
margin: 15px 0 5px;
}
}
@media screen and (min-width: 60em) {
.system-status-general-info__item-icon {
width: 55px;
height: 55px;
}
.system-status-general-info__item-icon:before {
background-size: 35px;
}
.system-status-general-info__item-icon--php:before {
background-size: 55px;
}
.system-status-general-info__run-cron {
position: absolute;
top: 1em;
right: 1em; /* LTR */
margin-top: 0;
}
[dir="rtl"] .system-status-general-info__run-cron {
left: 1em;
right: auto;
}
}
@media screen and (max-width: 48em) {
.system-status-general-info__header {
display: none;
}
.system-status-general-info {
border-top: 0;
margin-top: 25px;
}
}

View File

@ -3,13 +3,151 @@
* Seven styles for the System Status Report.
*/
.system-status-report__requirements-group {
padding-top: 20px;
}
.system-status-report__entry {
border: 0;
border-top: 1px solid #ccc;
border-bottom: inherit;
margin: 0;
width: 100%;
overflow: auto;
}
.system-status-report__entry:first-child {
border-top: 1px solid #bebfb9;
}
.system-status-report__entry:last-child {
.system-status-report__entry:last-of-type {
border-bottom: 1px solid #bebfb9;
}
.system-status-report__entry--error {
background-color: transparent;
}
.system-status-report__entry--warning {
background-color: transparent;
}
/* Account for native and poly-filled details element */
.system-status-report__status-title {
position: relative;
padding: 1em 1em 1em 3em; /* LTR */
box-sizing: border-box;
width: 100%;
font-weight: bold;
}
.system-status-report__status-title .details-title {
color: inherit;
text-transform: none;
}
html:not(.details) .system-status-report__status-title {
padding-left: 0;
}
.system-status-report__status-title .details-title {
padding-left: 3em; /* LTR */
}
[dir="rtl"] .system-status-report__status-title .details-title {
padding-right: 3em;
padding-left: 0;
}
[dir="rtl"].details .system-status-report__status-title {
padding: 1em 3em 1em 1em;
}
.collapse-processed > .system-status-report__status-title:before {
float: right; /* LTR */
}
.system-status-report__status-title::-webkit-details-marker {
float: right; /* LTR */
}
[dir="rtl"] .collapse-processed > .system-status-report__status-title:before {
float: left;
}
[dir="rtl"] .system-status-report__status-title::-webkit-details-marker {
float: left;
}
/* Make poly-filled details and summary elements behave correctly. */
.system-status-report summary:first-child ~ * {
display: none;
}
.system-status-report details[open] > *,
.system-status-report details > summary:first-child {
display: block;
}
.system-status-report__status-title .details-title:before,
.details .system-status-report__status-icon:before {
content: "";
background-repeat: no-repeat;
background-size: contain;
background-position: top center;
height: 16px;
width: 16px;
position: absolute;
left: 10px; /* LTR */
top: 1em;
display: inline-block;
vertical-align: top;
margin-right: 10px; /* LTR */
}
[dir="rtl"] .system-status-report__status-title .details-title:before,
[dir="rtl"].details .system-status-report__status-title:before {
left: auto;
right: 10px;
margin-right: 0;
}
.system-status-report__status-icon--error .details-title:before,
.details .system-status-report__status-icon--error:before {
background-image: url(../../../stable/images/core/icons/e32700/error.svg);
}
.system-status-report__status-icon--warning .details-title:before,
.details .system-status-report__status-icon--warning:before {
background-image: url(../../../stable/images/core/icons/e29700/warning.svg);
}
.system-status-report__entry__value {
box-sizing: border-box;
padding: 0 1em 1em 3em; /* LTR */
}
[dir="rtl"] .system-status-report__entry__value {
padding-right: 3em;
padding-left: 1em;
}
@media screen and (max-width: 48em) {
.system-status-report {
word-wrap: break-word;
}
}
@media screen and (min-width: 48em) {
.system-status-report__entry::after {
display: table;
content: '';
clear: both;
}
.system-status-report__status-title {
width: 18rem;
float: left; /* LTR */
cursor: default;
}
.system-status-report__status-title:hover,
.system-status-report__status-title:focus {
text-decoration: none;
}
[dir="rtl"] .system-status-report__status-title {
float: right;
}
.system-status-report__status-title::-webkit-details-marker {
display: none;
}
.collapse-processed > .system-status-report__status-title:before {
position: relative;
top: 3px;
}
.system-status-report__entry__value {
width: calc(100% - 23em);
float: right;
display: block;
padding-left: 0; /* LTR */
padding-top: 1em;
}
[dir="rtl"] .system-status-report__entry__value {
padding-left: 0;
padding-right: 3em;
}
}

View File

@ -38,7 +38,6 @@ tbody tr:hover,
tbody tr:focus {
background: #f7fcff;
}
/* See colors.css */
tbody tr.color-warning:hover,
tbody tr.color-warning:focus {
@ -48,6 +47,7 @@ tbody tr.color-error:hover,
tbody tr.color-error:focus {
background: #fcf4f2;
}
td,
th {
vertical-align: middle;

View File

@ -2,6 +2,7 @@
* @file
* Maintenance theming.
*/
.maintenance-page {
background-color: #e0e0d8;
background-image: -webkit-radial-gradient(hsl(203, 2%, 90%), hsl(203, 2%, 95%));
@ -51,7 +52,6 @@
.task-list {
margin-left: 0; /* LTR */
list-style-type: none;
list-style-image: none;
padding-left: 0; /* LTR */
padding-bottom: 1em;
}
@ -142,7 +142,7 @@
}
.layout-container {
margin: 0 auto;
max-width: 770px;
min-height: 75%;
width: 75%;
border-radius: 5px;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
@ -181,3 +181,21 @@
margin: 0.75em 1.9em;
}
}
/**
* Status report customization for install and update page.
*/
.system-status-report__status-title {
float: none;
width: 100%;
}
.system-status-report__entry__value {
float: none;
width: 100%;
padding-left: 3em; /* LTR */
padding-top: 0;
}
[dir="rtl"] .system-status-report__entry__value {
padding-left: 1em;
padding-right: 3em;
}

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="42.659" height="46.603" viewBox="0 0 42.659 46.603">
<path fill="#CCC" d="M24.15 3.73V0h-8v3.915C6.15 6.13 0 14.717 0 24.978 0 36.92 9.975 46.603 21.918 46.603s20.74-9.682 20.74-21.625c0-10.576-8.507-19.372-18.507-21.25zm7 24.072H17.83V11h5v12.802h8.32v4z"/>
</svg>

After

Width:  |  Height:  |  Size: 315 B

View File

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="47.411" height="53.531" viewBox="0 0 47.411 53.531">
<circle fill="#CCC" cx="22.308" cy="41.593" r="8.449"/>
<path fill="#CCC" d="M32.813 31.532c2.503 2.614 4.044 6.156 4.044 10.06 0 4.945-2.47 9.31-6.24 11.94 6.97-2.15 12.733-7.388 15.314-13.73 3.57-8.776.247-15.38-5.33-21.37.17.776.264 1.58.264 2.406 0 5.078-3.405 9.36-8.05 10.694z"/>
<circle fill="#CCC" cx="29.735" cy="20.838" r="6.463"/>
<path fill="#CCC" d="M11.178 50.96c-2.134-2.53-3.42-5.798-3.42-9.368 0-7.448 5.598-13.584 12.814-14.442-1.238-1.794-1.965-3.968-1.965-6.312 0-6.145 4.982-11.128 11.13-11.128.507 0 1.006.037 1.495.103C27.59 6.67 23.957 3.483 21.09 0 22.553 15.257 7.192 9.713 1.514 23.773c-3.81 9.433-.376 21.095 9.663 27.188z"/>
</svg>

After

Width:  |  Height:  |  Size: 769 B

View File

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="38.847" height="44.262" viewBox="0 0 38.847 44.262">
<path fill="#CCC" d="M19.745 0c5.74.123 12.272.953 16.9 4.668 1.865 1.498 2.786 3.91 1.597 6.126-1.255 2.34-4.13 3.733-6.518 4.6-5.63 2.04-12.113 2.38-18.014 1.573-2.92-.4-5.91-1.103-8.58-2.374C2.94 13.553.39 11.788.037 9.19c-.532-3.925 4.23-6.23 7.264-7.3C11.287.482 15.54.037 19.745 0c4.302.092-3.334.03 0 0z"/>
<path fill="#CCC" d="M6.76 17.5c3.702 1.427 7.65 1.972 11.6 2.09 4.058.12 8.107-.424 12.023-1.523 4.227-1.186 7.227-3.624 8.463-6.145v5.965c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.135-.626-2.21-.626-3.486v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
<path fill="#CCC" d="M6.76 26.436c3.702 1.428 7.65 1.973 11.6 2.09 4.058.12 8.107-.423 12.023-1.522 4.227-1.186 7.227-3.624 8.463-6.145v5.964c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.135-.626-2.21-.626-3.486v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
<path fill="#CCC" d="M6.76 35.374c3.702 1.428 7.65 1.973 11.6 2.09 4.058.12 8.107-.423 12.023-1.522 4.227-1.186 7.227-3.624 8.463-6.145v5.965c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.134-.626-2.21-.626-3.485v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="66" height="33.447" viewBox="0 0 66 33.447">
<g fill="#CCC">
<path d="M49.5 12.255h-2.7l-1.473 7h2.4c1.59 0 2.773-.342 3.55-.94.78-.6 1.304-1.62 1.577-3.023.26-1.345.142-1.975-.357-2.528-.5-.553-1.498-.51-2.996-.51z"/>
<path d="M33 0C14.775 0 0 7.488 0 16.724s14.775 16.724 33 16.724 33-7.488 33-16.724S51.225 0 33 0zm-9.328 19.982c-.787.737-1.662 1.376-2.625 1.69-.963.313-2.19.583-3.68.583H13.99l-.935 5H9.11l3.52-18h7.584c2.28 0 3.946.34 4.992 1.537 1.046 1.197 1.36 2.74.944 4.885-.172.884-.462 1.628-.87 2.36-.413.732-.947 1.338-1.608 1.945zm11.51 2.273l1.558-8.124c.177-.91.112-1.29-.196-1.62-.308-.33-.962-.255-1.963-.255h-3.126l-2.016 10h-3.913l3.52-18h3.912l-.935 5h3.486c2.193 0 3.706.124 4.54.888.832.765 1.08 1.99.748 3.703l-1.637 8.41h-3.977zm21.747-6.708c-.173.884-.463 1.692-.872 2.424-.41.734-.944 1.404-1.605 2.01-.787.738-1.662 1.377-2.625 1.69-.963.314-2.19.584-3.68.584h-3.377l-.934 5h-3.944l3.518-18h7.584c2.282 0 3.946.34 4.992 1.537 1.046 1.2 1.36 2.61.943 4.757z"/>
<path d="M18.72 12.255h-2.703l-1.473 7h2.4c1.59 0 2.773-.342 3.552-.94.778-.6 1.303-1.62 1.576-3.023.26-1.345.142-1.975-.357-2.528-.5-.553-1.497-.51-2.996-.51z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="34" viewBox="0 0 44 34">
<path fill="#CCC" d="M29.98 7.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 7c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 0v10h44V0H0zM29.98 31.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 31c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 24v10h44V24H0zM29.98 19.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 19c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 12v10h44V12H0z"/>
</svg>

After

Width:  |  Height:  |  Size: 666 B

View File

@ -0,0 +1,57 @@
/**
* @file
* Provides responsive behaviors to HTML details elements.
*/
(function ($, Drupal) {
'use strict';
/**
* Initializes the responsive behaviors for details elements.
*
* @type {Drupal~behavior}
*
* @prop {Drupal~behaviorAttach} attach
* Attaches the responsive behavior to status report specific details elements.
*/
Drupal.behaviors.responsiveDetails = {
attach: function (context) {
var $details = $(context).find('details').once('responsive-details');
if (!$details.length) {
return;
}
function detailsToggle(matches) {
if (matches) {
$details.attr('open', true);
$summaries.attr('aria-expanded', true);
$summaries.on('click.details-open', false);
}
else {
// If user explicitly opened one, leave it alone.
var $notPressed = $details
.find('> summary[aria-pressed!=true]')
.attr('aria-expanded', false);
$notPressed
.parent('details')
.attr('open', false);
// After resize, allow user to close previously opened details.
$summaries.off('.details-open');
}
}
function handleDetailsMQ(event) {
detailsToggle(event.matches);
}
var $summaries = $details.find('> summary');
var mql = window.matchMedia('(min-width:48em)');
mql.addListener(handleDetailsMQ);
detailsToggle(mql.matches);
}
};
})(jQuery, Drupal);

View File

@ -22,6 +22,12 @@ core: 8.x
libraries:
- seven/global-styling
libraries-override:
system/base:
css:
component:
/core/themes/stable/css/system/components/system-status-counter.css: css/components/system-status-counter.css
/core/themes/stable/css/system/components/system-status-report-counters.css: css/components/system-status-report-counters.css
/core/themes/stable/css/system/components/system-status-report-general-info.css: css/components/system-status-report-general-info.css
core/drupal.vertical-tabs:
css:
component:

View File

@ -27,7 +27,10 @@ global-styling:
css/components/tables.css: {}
css/components/search-admin-settings.css: {}
css/components/tablesort-indicator.css: {}
css/components/system-status-report-general-info.css: {}
css/components/system-status-report.css: {}
css/components/system-status-report-counters.css: {}
css/components/system-status-counter.css: {}
css/components/tabs.css: {}
css/components/views-ui.css: {}
layout:
@ -74,6 +77,18 @@ drupal.nav-tabs:
- core/drupal
- core/jquery.once
- core/drupal.debounce
- core/collapse
drupal.responsive-detail:
version: VERSION
js:
js/responsive-details.js: {}
dependencies:
- core/matchmedia
- core/matchmedia.addListener
- core/jquery
- core/jquery.once
- core/collapse
vertical-tabs:
version: VERSION

View File

@ -0,0 +1,26 @@
{#
/**
* @file
* Theme override for status report counter.
*
* Available variables:
* - amount: The number shown on counter.
* - text: The text shown on counter.
* - severity: The severity of the counter.
*
* @ingroup themable
*/
#}
{%
set classes = [
'system-status-counter',
'system-status-counter--' ~ severity,
]
%}
<span{{ attributes.addClass(classes) }}>
<span class="system-status-counter__status-icon system-status-counter__status-icon--{{ severity }}"></span>
<span class="system-status-counter__status-title">
<span class="system-status-counter__title-count">{{ amount }} {{ text }}</span>
<span class="system-status-counter__details"><a href="#{{ severity }}" ><span class="visually-hidden">{{ text }} </span>Details</a></span>
</span>
</span>

View File

@ -0,0 +1,99 @@
{#
/**
* @file
* Theme override for status report general info.
*
* Available variables:
* - drupal: The status of Drupal installation:
* - value: The current status of Drupal installation.
* - description: The description for current status of Drupal installation.
* - cron: The status of cron:
* - value: The current status of cron.
* - description: The description for current status of cron.
* - cron.run_cron: An array to render a button for running cron.
* - database_system: The status of database system:
* - value: The current status of database sytem.
* - description: The description for current status of cron.
* - database_system_version: The info about current database version:
* - value: The current version of database.
* - description: The description for current version of database.
* - php: The current version of PHP:
* - value: The status of currently installed PHP version.
* - description: The description for current installed PHP version.
* - php_memory_limit: The info about current PHP memory limit:
* - value: The status of currently set PHP memory limit.
* - description: The description for currently set PHP memory limit.
* - webserver: The info about currently installed web server:
* - value: The status of currently installed web server.
* - description: The description for the status of currently installed web
* server.
*/
#}
<div class="system-status-general-info">
<h2 class="system-status-general-info__header">{{ 'General System Information'|t }}</h2>
<div class="system-status-general-info__items">
<div class="system-status-general-info__item">
<span class="system-status-general-info__item-icon system-status-general-info__item-icon--d8"></span>
<div class="system-status-general-info__item-details">
<h3 class="system-status-general-info__item-title">{{ 'Drupal Version'|t }}</h3>
{{ drupal.value }}
{% if drupal.description %}
<div class="description">{{ drupal.description }}</div>
{% endif %}
</div>
</div>
<div class="system-status-general-info__item">
<span class="system-status-general-info__item-icon system-status-general-info__item-icon--clock"></span>
<div class="system-status-general-info__item-details">
<h3 class="system-status-general-info__item-title">{{ 'Last Cron Run'|t }}</h3>
{{ cron.value }}
{% if cron.run_cron %}
<div class="system-status-general-info__run-cron">{{ cron.run_cron }}</div>
{% endif %}
{% if cron.description %}
<div class="system-status-general-info__description">{{ cron.description }}</div>
{% endif %}
</div>
</div>
<div class="system-status-general-info__item">
<span class="system-status-general-info__item-icon system-status-general-info__item-icon--server"></span>
<div class="system-status-general-info__item-details">
<h3 class="system-status-general-info__item-title">{{ 'Web Server'|t }}</h3>
{{ webserver.value }}
{% if webserver.description %}
<div class="description">{{ webserver.description }}</div>
{% endif %}
</div>
</div>
<div class="system-status-general-info__item">
<span class="system-status-general-info__item-icon system-status-general-info__item-icon--php"></span>
<div class="system-status-general-info__item-details">
<h3 class="system-status-general-info__item-title">{{ 'PHP'|t }}</h3>
<h4 class="system-status-general-info__sub-item-title">{{ 'Version'|t }}</h4>{{ php.value }}
{% if php.description %}
<div class="description">{{ php.description }}</div>
{% endif %}
<h4 class="system-status-general-info__sub-item-title">{{ 'Memory limit'|t }}</h4>{{ php_memory_limit.value }}
{% if php_memory_limit.description %}
<div class="description">{{ php_memory_limit.description }}</div>
{% endif %}
</div>
</div>
<div class="system-status-general-info__item">
<span class="system-status-general-info__item-icon system-status-general-info__item-icon--database"></span>
<div class="system-status-general-info__item-details">
<h3 class="system-status-general-info__item-title">{{ 'Database'|t }}</h3>
<h4 class="system-status-general-info__sub-item-title">{{ 'Version'|t }}</h4>{{ database_system_version.value }}
{% if database_system_version.description %}
<div class="description">{{ database_system_version.description }}</div>
{% endif %}
<h4 class="system-status-general-info__sub-item-title">{{ 'System'|t }}</h4>{{ database_system.value }}
{% if database_system.description %}
<div class="description">{{ database_system.description }}</div>
{% endif %}
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,50 @@
{#
/**
* @file
* Theme override to display status report.
*
* - grouped_requirements: Contains grouped requirements.
* Each group contains:
* - title: The title of the group.
* - type: The severity of the group.
* - items: The requirement instances.
* Each requirement item contains:
* - title: The title of the requirement.
* - value: (optional) The requirement's status.
* - description: (optional) The requirement's description.
* - severity_title: The title of the severity.
* - severity_status: Indicates the severity status.
*/
#}
{{ attach_library('core/drupal.collapse') }}
{{ attach_library('seven/drupal.responsive-detail') }}
<div class="system-status-report">
{% for group in grouped_requirements %}
<div class="system-status-report__requirements-group">
<h3 id="{{ group.type }}">{{ group.title }}</h3>
{% for requirement in group.items %}
<details class="system-status-report__entry system-status-report__entry--{{ group.type }} color-{{ group.type }}">
{%
set summary_classes = [
'system-status-report__status-title',
group.type in ['warning', 'error'] ? 'system-status-report__status-icon system-status-report__status-icon--' ~ group.type
]
%}
<summary{{ create_attribute({'class': summary_classes}) }} role="button">
{% if requirement.severity_title %}
<span class="visually-hidden">{{ requirement.severity_title }}</span>
{% endif %}
{{ requirement.title }}
</summary>
<div class="system-status-report__entry__value">
{{ requirement.value }}
{% if requirement.description %}
<div class="description">{{ requirement.description }}</div>
{% endif %}
</div>
</details>
{% endfor %}
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme override for the status report page.
*
* Available variables:
* - counters: The list of counter elements.
* - general_info: A render array to create general info element.
* - requirements: A render array to create requirements table.
*
* @see template_preprocess_status_report()
*/
#}
{% if counters|length == 3 %}
{% set element_width_class = ' system-status-report-counters__item--third-width' %}
{% elseif counters|length == 2 %}
{% set element_width_class = ' system-status-report-counters__item--half-width' %}
{% endif %}
<div class="system-status-report-counters">
{% for counter in counters %}
<div class="system-status-report-counters__item{{ element_width_class }}">
{{ counter }}
</div>
{% endfor %}
</div>
{{ general_info }}
{{ requirements }}

View File

@ -0,0 +1,28 @@
/**
* @file
* Styles for the system status counter component.
*/
.system-status-counter__status-icon {
display: inline-block;
height: 25px;
width: 25px;
vertical-align: middle;
}
.system-status-counter__status-icon:before {
content: "";
background-size: 20px;
background-position: center 2px;
background-repeat: no-repeat;
display: block;
}
.system-status-counter__status-icon--error:before {
background-image: url(../../../images/core/icons/e32700/error.svg);
}
.system-status-counter__status-icon--warning:before {
background-image: url(../../../images/core/icons/e29700/warning.svg);
}
.system-status-counter__status-icon--checked:before {
background-image: url(../../../images/core/icons/73b355/check.svg);
}

View File

@ -0,0 +1,27 @@
/**
* @file
* Styles for the system status report counters.
*/
.system-status-report-counters__item {
width: 100%;
padding: .5em 0;
text-align: center;
white-space: nowrap;
background-color: rgba(0, 0, 0, 0.063);
margin-bottom: .5em;
}
@media screen and (min-width: 60em) {
.system-status-report-counters {
flex-wrap: wrap;
display: flex;
justify-content: space-between;
}
.system-status-report-counters__item--half-width {
width: 49%;
}
.system-status-report-counters__item--third-width {
width: 33%;
}
}

View File

@ -0,0 +1,14 @@
/**
* @file
* Default styles for the System Status general info.
*/
.system-status-general-info__item {
border: 1px solid #ccc;
margin-top: 1em;
padding: 0 1em 1em;
}
.system-status-general-info__item-title {
border-bottom: 1px solid #ccc;
}

View File

@ -204,10 +204,11 @@ small .admin-link:after {
.system-status-report__status-title {
position: relative;
vertical-align: top;
width: 25%;
width: 100%;
padding: 10px 6px 10px 40px; /* LTR */
box-sizing: border-box;
font-weight: normal;
background-color: transparent;
}
[dir="rtl"] .system-status-report__status-title {
padding: 10px 40px 10px 6px;
@ -232,6 +233,9 @@ small .admin-link:after {
.system-status-report__status-icon--warning:before {
background-image: url(../../images/core/icons/e29700/warning.svg);
}
.system-status-report__entry__value {
padding: 1em .5em;
}
/**
* Appearance page.
@ -387,3 +391,6 @@ small .admin-link:after {
[dir="rtl"] .system-themes-admin-form {
clear: right;
}
.cron-description__run-cron {
display: block;
}

View File

@ -175,6 +175,9 @@ libraries-override:
css/components/reset-appearance.module.css: css/system/components/reset-appearance.module.css
css/components/resize.module.css: css/system/components/resize.module.css
css/components/sticky-header.module.css: css/system/components/sticky-header.module.css
css/components/system-status-counter.css: css/system/components/system-status-counter.css
css/components/system-status-report-counters.css: css/system/components/system-status-report-counters.css
css/components/system-status-report-general-info.css: css/system/components/system-status-report-general-info.css
css/components/tabledrag.module.css: css/system/components/tabledrag.module.css
css/components/tablesort.module.css: css/system/components/tablesort.module.css
css/components/tree-child.module.css: css/system/components/tree-child.module.css

View File

@ -0,0 +1,15 @@
{#
/**
* @file
* Theme override for the status report counter.
*
* Available variables:
* - amount: The number shown on counter.
* - text: The text shown on counter.
* - severity: The severity of the counter.
*
* @ingroup themable
*/
#}
{{ amount }} {{ text }}
<a href="#{{ severity }}"><span class="visually-hidden">{{ text }} </span>Details</a>

View File

@ -0,0 +1,81 @@
{#
/**
* @file
* Theme override for the status report general info.
*
* Available variables:
* - drupal: The status of Drupal installation:
* - value: The current status of Drupal installation.
* - description: The description for current status of Drupal installation.
* - cron: The status of cron:
* - value: The current status of cron.
* - description: The description for current status of cron.
* - cron.run_cron: An array to render a button for running cron.
* - database_system: The status of database system:
* - value: The current status of database sytem.
* - description: The description for current status of cron.
* - database_system_version: The info about current database version:
* - value: The current version of database.
* - description: The description for current version of database.
* - php: The current version of PHP:
* - value: The status of currently installed PHP version.
* - description: The description for current installed PHP version.
* - php_memory_limit: The info about current PHP memory limit:
* - value: The status of currently set PHP memory limit.
* - description: The description for currently set PHP memory limit.
* - webserver: The info about currently installed web server:
* - value: The status of currently installed web server.
* - description: The description for the status of currently installed web
* server.
*/
#}
<h2>{{ 'General System Information'|t }}</h2>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Drupal Version'|t }}</h3>
{{ drupal.value }}
{% if drupal.description %}
{{ drupal.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Last Cron Run'|t }}</h3>
{{ cron.value }}
{% if cron.run_cron %}
{{ cron.run_cron }}
{% endif %}
{% if cron.description %}
{{ cron.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Web Server'|t }}</h3>
{{ webserver.value }}
{% if webserver.description %}
{{ webserver.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'PHP'|t }}</h3>
<h4>{{ 'Version'|t }}</h4>{{ php.value }}
{% if php.description %}
{{ php.description }}
{% endif %}
<h4>{{ 'Memory limit'|t }}</h4>{{ php_memory_limit.value }}
{% if php_memory_limit.description %}
{{ php_memory_limit.description }}
{% endif %}
</div>
<div class="system-status-general-info__item">
<h3 class="system-status-general-info__item-title">{{ 'Database'|t }}</h3>
<h4>{{ 'Version'|t }}</h4>{{ database_system_version.value }}
{% if database_system_version.description %}
{{ database_system_version.description }}
{% endif %}
<h4>{{ 'System'|t }}</h4>{{ database_system.value }}
{% if database_system.description %}
{{ database_system.description }}
{% endif %}
</div>

View File

@ -0,0 +1,49 @@
{#
/**
* @file
* Theme override of grouped status report requirements.
*
* - grouped_requirements: Contains grouped requirements.
* Each group contains:
* - title: The title of the group.
* - type: The severity of the group.
* - items: The requirement instances.
* Each requirement item contains:
* - title: The title of the requirement.
* - value: (optional) The requirement's status.
* - description: (optional) The requirement's description.
* - severity_title: The title of the severity.
* - severity_status: Indicates the severity status.
*/
#}
{{ attach_library('core/drupal.collapse') }}
<div>
{% for group in grouped_requirements %}
<div>
<h3 id="{{ group.type }}">{{ group.title }}</h3>
{% for requirement in group.items %}
<details class="system-status-report__entry">
{%
set summary_classes = [
'system-status-report__status-title',
group.type in ['warning', 'error'] ? 'system-status-report__status-icon system-status-report__status-icon--' ~ group.type
]
%}
<summary{{ create_attribute({'class': summary_classes}) }} role="button">
{% if requirement.severity_title %}
<span class="visually-hidden">{{ requirement.severity_title }}</span>
{% endif %}
{{ requirement.title }}
</summary>
<div class="system-status-report__entry__value">
{{ requirement.value }}
{% if requirement.description %}
<div class="description">{{ requirement.description }}</div>
{% endif %}
</div>
</details>
{% endfor %}
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme override for the status report page.
*
* Available variables:
* - counters: The list of counter elements.
* - general_info: A render array to create general info element.
* - requirements: A render array to create requirements table.
*
* @see template_preprocess_status_report()
*/
#}
{% if counters|length == 3 %}
{% set element_width_class = ' system-status-report-counters__item--third-width' %}
{% elseif counters|length == 2 %}
{% set element_width_class = ' system-status-report-counters__item--half-width' %}
{% endif %}
<div class="system-status-report-counters">
{% for counter in counters %}
<div class="system-status-report-counters__item{{ element_width_class }}">
{{ counter }}
</div>
{% endfor %}
</div>
{{ general_info }}
{{ requirements }}