Skip to content
Snippets Groups Projects
Commit 62c91e97 authored by catch's avatar catch
Browse files

Issue #3266397 by quietone, murilohp, dww, AaronMcHale, benjifisher, Antoniya,...

Issue #3266397 by quietone, murilohp, dww, AaronMcHale, benjifisher, Antoniya, andregp, rkoller, kimberlly_amaral, ckrina: Highlight non-stable modules on the admin/modules/uninstall form
parent 9048a7d9
No related branches found
No related tags found
37 merge requests!7471uncessary 5 files are moved from media-library folder to misc folder,!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3143Issue #3313342: [PHP 8.1] Deprecated function: strpos(): Passing null to parameter #1 LayoutBuilderUiCacheContext.php on line 28,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2853#3274419 Makes BaseFieldOverride inherit the internal property from the base field.,!2719Issue #3110137: Remove Classy from core.,!2437Issue #3238257 by hooroomoo, Wim Leers: Fragment link pointing to <textarea>...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1254Issue #3238915: Refactor (if feasible) uses of the jQuery ready function to use VanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!873Issue #2875228: Site install not using batch API service,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
......@@ -2,13 +2,16 @@
namespace Drupal\system\Form;
use Drupal\Core\Extension\ExtensionLifecycle;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ModuleInstallerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
use Drupal\Core\Link;
use Drupal\Core\Update\UpdateHookRegistry;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
......@@ -150,6 +153,21 @@ public function buildForm(array $form, FormStateInterface $form_state) {
$form['modules'][$module->getName()]['name']['#markup'] = $name;
$form['modules'][$module->getName()]['description']['#markup'] = $this->t($module->info['description']);
$lifecycle = $module->info[ExtensionLifecycle::LIFECYCLE_IDENTIFIER];
if ($lifecycle !== ExtensionLifecycle::STABLE && !empty($module->info[ExtensionLifecycle::LIFECYCLE_LINK_IDENTIFIER])) {
$form['modules'][$module->getName()]['name']['#markup'] .= ' ' . Link::fromTextAndUrl('(' . $this->t('@lifecycle', ['@lifecycle' => ucfirst($lifecycle)]) . ')',
Url::fromUri($module->info[ExtensionLifecycle::LIFECYCLE_LINK_IDENTIFIER], [
'attributes' =>
[
'class' => 'module-link--non-stable',
'aria-label' => $this->t('View information on the @lifecycle status of the module @module', [
'@lifecycle' => ucfirst($lifecycle),
'@module' => $module->info['name'],
]),
],
])
)->toString();
}
$form['uninstall'][$module->getName()] = [
'#type' => 'checkbox',
'#title' => $this->t('Uninstall @module module', ['@module' => $name]),
......
......@@ -3,4 +3,5 @@ type: module
description: 'Module in the experimental package to test experimental functionality.'
package: Core (Experimental)
lifecycle: experimental
lifecycle_link: https://example.com/experimental
version: 8.y.x-unstable
......@@ -4,4 +4,4 @@ description: 'Support module for testing an obsolete module extension.'
package: Testing
version: VERSION
lifecycle: obsolete
lifecycle_link: 'https://i.giphy.com/media/100JPq1ylYXEti/giphy.webp'
lifecycle_link: 'https://example.com/obsolete'
......@@ -59,9 +59,29 @@ public function testUninstallPage() {
]);
$node->save();
// Change the config directly to "install" non-stable modules.
$this->config('core.extension')
->set('module.system_status_obsolete_test', 0)
->set('module.deprecated_module', 0)
->set('module.experimental_module_test', 0)
->save();
$this->rebuildAll();
$this->drupalGet('admin/modules/uninstall');
$this->assertSession()->titleEquals('Uninstall | Drupal');
// Check that the experimental module link was rendered correctly.
$this->assertSession()->elementExists('xpath', "//a[contains(@aria-label, 'View information on the Experimental status of the module Experimental Test')]");
$this->assertSession()->elementExists('xpath', "//a[contains(@href, 'https://example.com/experimental')]");
// Check that the deprecated module link was rendered correctly.
$this->assertSession()->elementExists('xpath', "//a[contains(@aria-label, 'View information on the Deprecated status of the module Deprecated module')]");
$this->assertSession()->elementExists('xpath', "//a[contains(@href, 'http://example.com/deprecated')]");
// Check that the obsolete module link was rendered correctly.
$this->assertSession()->elementExists('xpath', "//a[contains(@aria-label, 'View information on the Obsolete status of the module System obsolete status test')]");
$this->assertSession()->elementExists('xpath', "//a[contains(@href, 'https://example.com/obsolete')]");
foreach (\Drupal::service('extension.list.module')->getAllInstalledInfo() as $module => $info) {
$field_name = "uninstall[$module]";
if (!empty($info['required'])) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment