diff --git a/core/modules/update/templates/update-last-check.html.twig b/core/modules/update/templates/update-last-check.html.twig new file mode 100644 index 0000000..86ed1ff --- /dev/null +++ b/core/modules/update/templates/update-last-check.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Default theme implementation for the last time we checked for update data. + * + * Available variables: + * - last: The timestamp when the site last checked for available updates. + * + * @see template_preprocess() + * @see template_preprocess_update_last_check() + * + * @ingroup themeable + */ +#} +
+ {% if last_checked %} + {{ 'Last checked: @time ago'|t({'@time': time}) }} + {% else %} + {{ 'Last checked: never'|t }} + {% endif %} + ({{ link }}) +
diff --git a/core/modules/update/templates/update-report.html.twig b/core/modules/update/templates/update-report.html.twig new file mode 100644 index 0000000..78b0f05 --- /dev/null +++ b/core/modules/update/templates/update-report.html.twig @@ -0,0 +1,58 @@ +{# +/** + * @file + * Default theme implementation for the project status report. + * + * Available variables: + * - data: An array of data about each project's status. + * + * @see template_preprocess() + * @see template_preprocess_update_report() + * + * @ingroup themeable + */ +#} +{{dump(project_types) }} +{% for project_type in project_types %} +

{{ project_type.label }}

+ + + {% for project in project_type.projects %} + +
+ {% if project.status_label is empty %} + {{ project.status }} + {% else %} + {{ project.status_label }} {{ project.icon }} + {% endif %} +
+
+ {{ project.title }} {{ project.existing_version }} + {{ project.datestamp }} +
+
+ {% if project.extra %} +
+ {% for extra in project.extra %} + + {{ extra.label }}: {{ extra.data }} +
+ {% endfor %} +
+ {% endif %} + +
+ {{ 'Includes' | t }}: + {{ project.includes }} +
+
+ {{ project.base_themes }} +
+
+ {{ project.sub_themes }} +
+ + {% endfor %} + +
+{% endfor %} diff --git a/core/modules/update/templates/update-status-label.html.twig b/core/modules/update/templates/update-status-label.html.twig new file mode 100644 index 0000000..2f036b1 --- /dev/null +++ b/core/modules/update/templates/update-status-label.html.twig @@ -0,0 +1,20 @@ +{# +/** + * @file + * Default theme implementation for an update status label. + * + * Available variables: + * - text: The status label text. + * - attributes: Remaining HTML attributes for the element. + * - attributes.class: HTML classes that can be used to style contextually + * through CSS. + * + * @see template_preprocess() + * @see template_preprocess_update_status_label() + * + * @ingroup themeable + */ +#} +{% if text %} + {{ text|t }} +{% endif %} diff --git a/core/modules/update/templates/update-version.html.twig b/core/modules/update/templates/update-version.html.twig new file mode 100644 index 0000000..f3aec6a --- /dev/null +++ b/core/modules/update/templates/update-version.html.twig @@ -0,0 +1,32 @@ +{# +/** + * @file + * Default theme implementation for the version display of a project. + * + * Available variables: + * - version: An array of data about the latest released version, containing: + * - version: The version number. + * - release_link: The URL for the release notes. + * - date: The date of the release. + * - download_link: The URL for the downloadable file. + * - tag: The title of the project. + * - class: A string containing extra classes for the wrapping table. + * + * @see template_preprocess + * @see template_preprocess_update_version + * + * @ingroup themeable + */ +#} + + + {{ tag }} + + {{ version_link }} + {{ version_date }} + + + {{ version_links }} + + + diff --git a/core/modules/update/update.manager.inc b/core/modules/update/update.manager.inc index 0047a52..a6ce460 100644 --- a/core/modules/update/update.manager.inc +++ b/core/modules/update/update.manager.inc @@ -67,7 +67,11 @@ function update_manager_update_form($form, $form_state = array(), $context) { return $form; } - $form['#theme'] = 'update_manager_update_form'; + $last = state()->get('update.last_check') ?: 0; + $form['update_lask_check'] = array( + '#theme' => 'update_last_check', + '#last' => $last, + ); $available = update_get_available(TRUE); if (empty($available)) { @@ -268,23 +272,6 @@ function update_manager_update_form($form, $form_state = array(), $context) { } /** - * Returns HTML for the first page in the process of updating projects. - * - * @param $variables - * An associative array containing: - * - form: A render element representing the form. - * - * @ingroup themeable - */ -function theme_update_manager_update_form($variables) { - $form = $variables['form']; - $last = state()->get('update.last_check') ?: 0; - $output = theme('update_last_check', array('last' => $last)); - $output .= drupal_render_children($form); - return $output; -} - -/** * Form validation handler for update_manager_update_form(). * * Ensures that at least one project is selected. diff --git a/core/modules/update/update.module b/core/modules/update/update.module index 7dee311..effb963 100644 --- a/core/modules/update/update.module +++ b/core/modules/update/update.module @@ -257,21 +257,24 @@ function update_manager_access() { */ function update_theme() { return array( - 'update_manager_update_form' => array( - 'render element' => 'form', - 'file' => 'update.manager.inc', - ), 'update_last_check' => array( 'variables' => array('last' => NULL), + 'template' => 'update-last-check', ), 'update_report' => array( 'variables' => array('data' => NULL), + 'file' => 'update.report.inc', + 'template' => 'update-report', ), 'update_version' => array( 'variables' => array('version' => NULL, 'tag' => NULL, 'class' => array()), + 'file' => 'update.report.inc', + 'template' => 'update-version', ), 'update_status_label' => array( 'variables' => array('status' => NULL), + 'file' => 'update.report.inc', + 'template' => 'update-status-label', ), ); } @@ -625,13 +628,11 @@ function _update_project_status_sort($a, $b) { * @see theme_update_available_updates_form() * @ingroup themeable */ -function theme_update_last_check($variables) { +function template_preprocess_update_last_check(&$variables) { $last = $variables['last']; - $output = '
'; - $output .= $last ? t('Last checked: @time ago', array('@time' => format_interval(REQUEST_TIME - $last))) : t('Last checked: never'); - $output .= ' (' . l(t('Check manually'), 'admin/reports/updates/check', array('query' => drupal_get_destination())) . ')'; - $output .= "
\n"; - return $output; + $variables['last_checked'] = ($last != NULL); + $variables['time'] = format_interval(REQUEST_TIME - $last); + $variables['link'] = l(t('Check manually'), 'admin/reports/updates/check', array('query' => drupal_get_destination())); } /** diff --git a/core/modules/update/update.report.inc b/core/modules/update/update.report.inc index 607b523..d9eb33a 100644 --- a/core/modules/update/update.report.inc +++ b/core/modules/update/update.report.inc @@ -1,5 +1,7 @@ get('update.last_check') ?: 0; + $build['last_check'] = array( + '#theme' => 'update_last_check', + '#last' => $last, + ); if ($available = update_get_available(TRUE)) { module_load_include('inc', 'update', 'update.compare'); $data = update_calculate_project_data($available); - return theme('update_report', array('data' => $data)); } else { - return theme('update_report', array('data' => _update_no_data())); + $data = _update_no_data(); + } + + if (!is_array($data)) { + $build['data'] = array( + '#markup' => $data, + '#prefix' => '

', + '#suffix' => '

', + ); + return $build; } + + + $build['report'] = array( + '#theme' => 'update_report', + '#data' => $data, + ); + return $build; } + + /** - * Returns HTML for the project status report. + * Prepares variables the project status report. + * + * Default template: container.html.twig. * * @param array $variables * An associative array containing: * - data: An array of data about each project's status. * - * @ingroup themeable */ -function theme_update_report($variables) { - $data = $variables['data']; - - $last = state()->get('update.last_check') ?: 0; - $output = theme('update_last_check', array('last' => $last)); - - if (!is_array($data)) { - $output .= '

' . $data . '

'; - return $output; - } - - $header = array(); +function template_preprocess_update_report(&$variables) { + $projects = $variables['data']; $rows = array(); $notification_level = config('update.settings')->get('notification.threshold'); @@ -49,16 +65,24 @@ function theme_update_report($variables) { // Create an array of status values keyed by module or theme name, since // we'll need this while generating the report if we have to cross reference // anything (e.g. subthemes which have base themes missing an update). - foreach ($data as $project) { + foreach ($projects as $project) { foreach ($project['includes'] as $key => $name) { $status[$key] = $project['status']; } } - foreach ($data as $project) { + foreach ($projects as $project) { switch ($project['status']) { case UPDATE_CURRENT: $class = 'ok'; + // $icon = array( + // '#theme' => 'image', + // '#uri' => 'core/misc/watchdog-ok.png', + // '#width' => 18, + // '#height' => 18, + // '#alt' => t('ok'), + // '#title' => t('ok') + // ); $icon = theme('image', array('uri' => 'core/misc/watchdog-ok.png', 'width' => 18, 'height' => 18, 'alt' => t('ok'), 'title' => t('ok'))); break; case UPDATE_UNKNOWN: @@ -80,32 +104,40 @@ function theme_update_report($variables) { $icon = theme('image', array('uri' => 'core/misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('warning'), 'title' => t('warning'))); break; } + // $project['attributes'] = new Attribute(array('class' => array($class))); + $project['icon'] = $icon; + + // $row = '
'; + // $status_label = theme('update_status_label', array('status' => $project['status'])); + $project['status_label'] = array( + '#theme' => 'update_status_label', + '#status' => $project['status'], + ); - $row = '
'; - $status_label = theme('update_status_label', array('status' => $project['status'])); - $row .= !empty($status_label) ? $status_label : check_plain($project['reason']); - $row .= '' . $icon . ''; - $row .= "
\n"; + if (!empty($project['reason'])) { + $project['reason'] = check_plain($project['reason']); + } - $row .= '
'; if (isset($project['title'])) { if (isset($project['link'])) { - $row .= l($project['title'], $project['link']); + $project['title'] = l($project['title'], $project['link']); } else { - $row .= check_plain($project['title']); + $project['title'] = check_plain($project['title']); } } else { - $row .= check_plain($project['name']); + $project['title'] = check_plain($project['name']); } - $row .= ' ' . check_plain($project['existing_version']); - if ($project['install_type'] == 'dev' && !empty($project['datestamp'])) { - $row .= ' (' . format_date($project['datestamp'], 'custom', 'Y-M-d') . ')'; + + $project['existing_version'] = check_plain($project['existing_version']); + $project['install_type'] = $project['install_type']; + + if (!empty($project['datestamp'])) { + $project['datestamp'] = format_date($project['datestamp'], 'custom', 'Y-M-d'); } - $row .= "
\n"; - $versions_inner = ''; + $versions_inner = array(); $security_class = array(); $version_class = array(); if (isset($project['recommended'])) { @@ -115,7 +147,10 @@ function theme_update_report($variables) { // If there's only 1 security update and it has the same version we're // recommending, give it the same CSS class as if it was recommended, // but don't print out a separate "Recommended" line for this project. - if (!empty($project['security updates']) && count($project['security updates']) == 1 && $project['security updates'][0]['version'] === $project['recommended']) { + if (!empty($project['security updates']) + && count($project['security updates']) == 1 + && $project['security updates'][0]['version'] === $project['recommended'] + ) { $security_class[] = 'version-recommended'; $security_class[] = 'version-recommended-strong'; } @@ -134,68 +169,90 @@ function theme_update_report($variables) { ) { $version_class[] = 'version-recommended-strong'; } - $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['recommended']], 'tag' => t('Recommended version:'), 'class' => $version_class)); + $versions_inner[] = array( + '#theme' => 'update_version', + '#version' => $project['releases'][$project['recommended']], + '#tag' => t('Recommended version:'), + '#class' => $version_class, + ); } // Now, print any security updates. if (!empty($project['security updates'])) { $security_class[] = 'version-security'; foreach ($project['security updates'] as $security_update) { - $versions_inner .= theme('update_version', array('version' => $security_update, 'tag' => t('Security update:'), 'class' => $security_class)); + $versions_inner[] = array( + '#theme' => 'update_version', + '#version' => $security_update, + '#tag' => t('Security update:'), + '#class' => $security_class, + ); } } } if ($project['recommended'] !== $project['latest_version']) { - $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['latest_version']], 'tag' => t('Latest version:'), 'class' => array('version-latest'))); + $versions_inner[] = array( + '#theme' => 'update_version', + '#version' => $project['releases'][$project['latest_version']], + '#tag' => t('Latest version:'), + '#class' => array('version-latest'), + ); } if ($project['install_type'] == 'dev' && $project['status'] != UPDATE_CURRENT && isset($project['dev_version']) && $project['recommended'] !== $project['dev_version']) { - $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['dev_version']], 'tag' => t('Development version:'), 'class' => array('version-latest'))); + $versions_inner[] = array( + '#theme' => 'update_version', + '#version' => $project['releases'][$project['dev_version']], + '#tag' => t('Development version:'), + '#class' => array('version-latest'), + ); } } if (isset($project['also'])) { foreach ($project['also'] as $also) { - $versions_inner .= theme('update_version', array('version' => $project['releases'][$also], 'tag' => t('Also available:'), 'class' => array('version-also-available'))); + $versions_inner[] = array( + '#theme' => 'update_version', + '#version' => $project['releases'][$also], + '#tag' => t('Also available:'), + '#class' => array('version-also-available'), + ); } } if (!empty($versions_inner)) { - $row .= "
\n" . $versions_inner . "
\n"; + $project['versions_inner'] = $versions_inner; } - $row .= "
\n"; + if (!empty($project['extra'])) { - $row .= '
' . "\n"; - foreach ($project['extra'] as $key => $value) { - $row .= '
'; - $row .= check_plain($value['label']) . ': '; - $row .= drupal_placeholder($value['data']); - $row .= "
\n"; + foreach ($project['extra'] as &$extra_item) { + $extra_item['attributes'] = new Attribute(array('class' => $extra_item['class'])); + $extra_item['label'] = check_plain($extra_item['label']); + $extra_item['data'] = drupal_placeholder($extra_item['data']); } - $row .= "
\n"; // extra div. } - $row .= '
'; sort($project['includes']); + if (!empty($project['disabled'])) { sort($project['disabled']); - // Make sure we start with a clean slate for each project in the report. - $includes_items = array(); - $row .= t('Includes:'); + $includes_items[] = t('Enabled: %includes', array('%includes' => implode(', ', $project['includes']))); $includes_items[] = t('Disabled: %disabled', array('%disabled' => implode(', ', $project['disabled']))); - $row .= theme('item_list', array('items' => $includes_items)); + + $project['includes'] = array( + '#theme' => 'item_list', + 'items' => $includes_items, + ); } else { - $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes']))); + $project['includes'] = t('%includes', array('%includes' => implode(', ', $project['includes']))); } - $row .= "
\n"; if (!empty($project['base_themes'])) { - $row .= '
'; asort($project['base_themes']); $base_themes = array(); foreach ($project['base_themes'] as $base_key => $base_theme) { @@ -203,25 +260,27 @@ function theme_update_report($variables) { case UPDATE_NOT_SECURE: case UPDATE_REVOKED: case UPDATE_NOT_SUPPORTED: - $base_themes[] = t('%base_theme (!base_label)', array('%base_theme' => $base_theme, '!base_label' => theme('update_status_label', array('status' => $status[$base_key])))); + $base_themes[] = t('%base_theme (!base_label)', array( + '%base_theme' => $base_theme, + '!base_label' => array( + '#theme' => 'update_status_label', + '#status' => $status[$base_key], + ), + )); break; default: $base_themes[] = drupal_placeholder($base_theme); } } - $row .= t('Depends on: !basethemes', array('!basethemes' => implode(', ', $base_themes))); - $row .= "
\n"; + $project['base_themes'] = t('Depends on: !basethemes', array('!basethemes' => implode(', ', $base_themes))); } if (!empty($project['sub_themes'])) { - $row .= '
'; sort($project['sub_themes']); - $row .= t('Required by: %subthemes', array('%subthemes' => implode(', ', $project['sub_themes']))); - $row .= "
\n"; + $project['sub_themes'] = t('Required by: %subthemes', array('%subthemes' => implode(', ', $project['sub_themes']))); } - $row .= "
\n"; // info div. if (!isset($rows[$project['project_type']])) { $rows[$project['project_type']] = array(); @@ -229,7 +288,7 @@ function theme_update_report($variables) { $row_key = isset($project['title']) ? drupal_strtolower($project['title']) : drupal_strtolower($project['name']); $rows[$project['project_type']][$row_key] = array( 'class' => array($class), - 'data' => array($row), + 'data' => array($project), ); } @@ -240,17 +299,247 @@ function theme_update_report($variables) { 'module-disabled' => t('Disabled modules'), 'theme-disabled' => t('Disabled themes'), ); + $variables['project_types'] = array(); foreach ($project_types as $type_name => $type_label) { - if (!empty($rows[$type_name])) { - ksort($rows[$type_name]); - $output .= "\n

" . $type_label . "

\n"; - $output .= theme('table', array('header' => $header, 'rows' => $rows[$type_name], 'attributes' => array('class' => array('update')))); + if (!empty($projects[$type_name])) { + ksort($projects[$type_name]); + $variables['project_types'][] = array( + 'label' => $type_label, + 'projects' => $projects[$type_name], + ); } } + debug($project_types); + debug($variables['project_types']); + drupal_add_css(drupal_get_path('module', 'update') . '/update.css'); - return $output; } +// /** +// * Prepares variables the project status report. +// * +// * Default template: container.html.twig. +// * +// * @param array $variables +// * An associative array containing: +// * - data: An array of data about each project's status. +// * +// */ +// function theme_update_report($variables) { +// $data = $variables['data']; + +// $output = ''; +// $header = array(); +// $rows = array(); + +// $notification_level = config('update.settings')->get('notification.threshold'); + +// // Create an array of status values keyed by module or theme name, since +// // we'll need this while generating the report if we have to cross reference +// // anything (e.g. subthemes which have base themes missing an update). +// foreach ($data as $project) { +// foreach ($project['includes'] as $key => $name) { +// $status[$key] = $project['status']; +// } +// } + +// foreach ($data as $project) { +// switch ($project['status']) { +// case UPDATE_CURRENT: +// $class = 'ok'; +// $icon = theme('image', array('uri' => 'core/misc/watchdog-ok.png', 'width' => 18, 'height' => 18, 'alt' => t('ok'), 'title' => t('ok'))); +// break; +// case UPDATE_UNKNOWN: +// case UPDATE_FETCH_PENDING: +// case UPDATE_NOT_FETCHED: +// $class = 'unknown'; +// $icon = theme('image', array('uri' => 'core/misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('warning'), 'title' => t('warning'))); +// break; +// case UPDATE_NOT_SECURE: +// case UPDATE_REVOKED: +// case UPDATE_NOT_SUPPORTED: +// $class = 'error'; +// $icon = theme('image', array('uri' => 'core/misc/watchdog-error.png', 'width' => 18, 'height' => 18, 'alt' => t('error'), 'title' => t('error'))); +// break; +// case UPDATE_NOT_CHECKED: +// case UPDATE_NOT_CURRENT: +// default: +// $class = 'warning'; +// $icon = theme('image', array('uri' => 'core/misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('warning'), 'title' => t('warning'))); +// break; +// } + +// $row = '
'; +// $status_label = theme('update_status_label', array('status' => $project['status'])); +// $row .= !empty($status_label) ? $status_label : check_plain($project['reason']); +// $row .= '' . $icon . ''; +// $row .= "
\n"; + +// $row .= '
'; +// if (isset($project['title'])) { +// if (isset($project['link'])) { +// $row .= l($project['title'], $project['link']); +// } +// else { +// $row .= check_plain($project['title']); +// } +// } +// else { +// $row .= check_plain($project['name']); +// } +// $row .= ' ' . check_plain($project['existing_version']); + +// if ($project['install_type'] == 'dev' && !empty($project['datestamp'])) { +// $row .= ' (' . format_date($project['datestamp'], 'custom', 'Y-M-d') . ')'; +// } +// $row .= "
\n"; + +// $versions_inner = ''; +// $security_class = array(); +// $version_class = array(); +// if (isset($project['recommended'])) { +// if ($project['status'] != UPDATE_CURRENT || $project['existing_version'] !== $project['recommended']) { + +// // First, figure out what to recommend. +// // If there's only 1 security update and it has the same version we're +// // recommending, give it the same CSS class as if it was recommended, +// // but don't print out a separate "Recommended" line for this project. +// if (!empty($project['security updates']) && count($project['security updates']) == 1 && $project['security updates'][0]['version'] === $project['recommended']) { +// $security_class[] = 'version-recommended'; +// $security_class[] = 'version-recommended-strong'; +// } +// else { +// $version_class[] = 'version-recommended'; +// // Apply an extra class if we're displaying both a recommended +// // version and anything else for an extra visual hint. +// if ($project['recommended'] !== $project['latest_version'] +// || !empty($project['also']) +// || ($project['install_type'] == 'dev' +// && isset($project['dev_version']) +// && $project['latest_version'] !== $project['dev_version'] +// && $project['recommended'] !== $project['dev_version']) +// || (isset($project['security updates'][0]) +// && $project['recommended'] !== $project['security updates'][0]) +// ) { +// $version_class[] = 'version-recommended-strong'; +// } +// $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['recommended']], 'tag' => t('Recommended version:'), 'class' => $version_class)); +// } + +// // Now, print any security updates. +// if (!empty($project['security updates'])) { +// $security_class[] = 'version-security'; +// foreach ($project['security updates'] as $security_update) { +// $versions_inner .= theme('update_version', array('version' => $security_update, 'tag' => t('Security update:'), 'class' => $security_class)); +// } +// } +// } + +// if ($project['recommended'] !== $project['latest_version']) { +// $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['latest_version']], 'tag' => t('Latest version:'), 'class' => array('version-latest'))); +// } +// if ($project['install_type'] == 'dev' +// && $project['status'] != UPDATE_CURRENT +// && isset($project['dev_version']) +// && $project['recommended'] !== $project['dev_version']) { +// $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['dev_version']], 'tag' => t('Development version:'), 'class' => array('version-latest'))); +// } +// } + +// if (isset($project['also'])) { +// foreach ($project['also'] as $also) { +// $versions_inner .= theme('update_version', array('version' => $project['releases'][$also], 'tag' => t('Also available:'), 'class' => array('version-also-available'))); +// } +// } + +// if (!empty($versions_inner)) { +// $row .= "
\n" . $versions_inner . "
\n"; +// } +// $row .= "
\n"; +// if (!empty($project['extra'])) { +// $row .= '
' . "\n"; +// foreach ($project['extra'] as $key => $value) { +// $row .= '
'; +// $row .= check_plain($value['label']) . ': '; +// $row .= drupal_placeholder($value['data']); +// $row .= "
\n"; +// } +// $row .= "
\n"; // extra div. +// } + +// $row .= '
'; +// sort($project['includes']); +// if (!empty($project['disabled'])) { +// sort($project['disabled']); +// // Make sure we start with a clean slate for each project in the report. +// $includes_items = array(); +// $row .= t('Includes:'); +// $includes_items[] = t('Enabled: %includes', array('%includes' => implode(', ', $project['includes']))); +// $includes_items[] = t('Disabled: %disabled', array('%disabled' => implode(', ', $project['disabled']))); +// $row .= theme('item_list', array('items' => $includes_items)); +// } +// else { +// $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes']))); +// } +// $row .= "
\n"; + +// if (!empty($project['base_themes'])) { +// $row .= '
'; +// asort($project['base_themes']); +// $base_themes = array(); +// foreach ($project['base_themes'] as $base_key => $base_theme) { +// switch ($status[$base_key]) { +// case UPDATE_NOT_SECURE: +// case UPDATE_REVOKED: +// case UPDATE_NOT_SUPPORTED: +// $base_themes[] = t('%base_theme (!base_label)', array('%base_theme' => $base_theme, '!base_label' => theme('update_status_label', array('status' => $status[$base_key])))); +// break; + +// default: +// $base_themes[] = drupal_placeholder($base_theme); +// } +// } +// $row .= t('Depends on: !basethemes', array('!basethemes' => implode(', ', $base_themes))); +// $row .= "
\n"; +// } + +// if (!empty($project['sub_themes'])) { +// $row .= '
'; +// sort($project['sub_themes']); +// $row .= t('Required by: %subthemes', array('%subthemes' => implode(', ', $project['sub_themes']))); +// $row .= "
\n"; +// } + +// $row .= "
\n"; // info div. + +// if (!isset($rows[$project['project_type']])) { +// $rows[$project['project_type']] = array(); +// } +// $row_key = isset($project['title']) ? drupal_strtolower($project['title']) : drupal_strtolower($project['name']); +// $rows[$project['project_type']][$row_key] = array( +// 'class' => array($class), +// 'data' => array($row), +// ); +// } + +// $project_types = array( +// 'core' => t('Drupal core'), +// 'module' => t('Modules'), +// 'theme' => t('Themes'), +// 'module-disabled' => t('Disabled modules'), +// 'theme-disabled' => t('Disabled themes'), +// ); +// foreach ($project_types as $type_name => $type_label) { +// if (!empty($rows[$type_name])) { +// ksort($rows[$type_name]); +// $output .= "\n

" . $type_label . "

\n"; +// $output .= theme('table', array('header' => $header, 'rows' => $rows[$type_name], 'attributes' => array('class' => array('update')))); +// } +// } +// drupal_add_css(drupal_get_path('module', 'update') . '/update.css'); +// return $output; +// } + /** * Returns HTML for a label to display for a project's update status. * @@ -261,24 +550,61 @@ function theme_update_report($variables) { * @see update_calculate_project_data() * @ingroup themeable */ -function theme_update_status_label($variables) { +function template_preprocess_update_status_label(&$variables) { + $variables['attributes'] = new Attribute(array('class' => array())); switch ($variables['status']) { case UPDATE_NOT_SECURE: - return '' . t('Security update required!') . ''; - + $variables['attributes']['class'] = 'security-error'; + $variables['text'] = 'Security update required!'; + break; case UPDATE_REVOKED: - return '' . t('Revoked!') . ''; - + $variables['attributes']['class'] = 'revoked'; + $variables['text'] = 'Revoked!'; + break; case UPDATE_NOT_SUPPORTED: - return '' . t('Not supported!') . ''; - + $variables['attributes']['class'] = 'not-supported'; + $variables['text'] = 'Not supported!'; + break; case UPDATE_NOT_CURRENT: - return '' . t('Update available') . ''; - + $variables['attributes']['class'] = 'not-current'; + $variables['text'] = 'Update available'; + break; case UPDATE_CURRENT: - return '' . t('Up to date') . ''; + $variables['attributes']['class'] = 'current'; + $variables['text'] = 'Up to date'; + break; + } +} +/** + * Prepare variables for the version display of a project. + * + * Default template: update-version.html.twig. + */ +function template_preprocess_update_version(&$variables) { + $version = $variables['version']; + $attributes = array('class' => array('version')); + + if (!empty($variables['class'])) { + $attributes['class'] += $variables['class']; } + $variables['attributes'] = new Attribute($attributes); + $variables['version_link'] = l($version['version'], $version['release_link']); + $variables['version_date'] = format_date($version['date'], 'custom', 'Y-M-d'); + + $links = array(); + $links['download'] = array( + 'title' => t('Download'), + 'href' => $version['download_link'], + ); + $links['release-notes'] = array( + 'title' => t('Release notes'), + 'href' => $version['release_link'], + ); + $variables['version_links'] = array( + '#theme' => 'links__update_version', + '#links' => $links, + ); } /** @@ -296,32 +622,32 @@ function theme_update_status_label($variables) { * * @ingroup themeable */ -function theme_update_version($variables) { - $version = $variables['version']; - $tag = $variables['tag']; - $class = implode(' ', $variables['class']); - - $output = ''; - $output .= ''; - $output .= ''; - $output .= '\n"; - $output .= '\n"; - $output .= ''; - $output .= ''; - $output .= "
' . $tag . "'; - $output .= l($version['version'], $version['release_link']); - $output .= ' (' . format_date($version['date'], 'custom', 'Y-M-d') . ')'; - $output .= "
\n"; - return $output; -} +// function theme_update_version($variables) { +// $version = $variables['version']; +// $tag = $variables['tag']; +// $class = implode(' ', $variables['class']); + +// $output = ''; +// $output .= ''; +// $output .= ''; +// $output .= '\n"; +// $output .= '\n"; +// $output .= ''; +// $output .= ''; +// $output .= "
' . $tag . "'; +// $output .= l($version['version'], $version['release_link']); +// $output .= ' (' . format_date($version['date'], 'custom', 'Y-M-d') . ')'; +// $output .= "
\n"; +// return $output; +// }