diff --git a/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php b/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php
index 00295d5..82f1468 100644
--- a/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php
+++ b/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php
@@ -19,7 +19,7 @@
* @code
* $form['pass'] = array(
* '#type' => 'password_confirm',
- * '#title' => t('Password'),
+ * '#title1' => t('New password'),
* '#size' => 25,
* );
* @endcode
@@ -72,7 +72,7 @@ public static function valueCallback(&$element, $input, FormStateInterface $form
public static function processPasswordConfirm(&$element, FormStateInterface $form_state, &$complete_form) {
$element['pass1'] = array(
'#type' => 'password',
- '#title' => t('Password'),
+ '#title' => !empty($element['#title1']) ? $element['#title1'] : t('Password'),
'#value' => empty($element['#value']) ? NULL : $element['#value']['pass1'],
'#required' => $element['#required'],
'#attributes' => array('class' => array('password-field', 'js-password-field')),
@@ -80,11 +80,16 @@ public static function processPasswordConfirm(&$element, FormStateInterface $for
);
$element['pass2'] = array(
'#type' => 'password',
- '#title' => t('Confirm password'),
+ '#title' => !empty($element['#title2']) ? $element['#title2'] : t('Confirm password'),
'#value' => empty($element['#value']) ? NULL : $element['#value']['pass2'],
'#required' => $element['#required'],
'#attributes' => array('class' => array('password-confirm', 'js-password-confirm')),
'#error_no_message' => TRUE,
+ '#states' => array(
+ 'visible' => array(
+ ':input[name="pass[pass1]"]' => ['filled' => TRUE],
+ ),
+ ),
);
$element['#element_validate'] = array(array(get_called_class(), 'validatePasswordConfirm'));
$element['#tree'] = TRUE;
diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php
index 8b0149e..ffe5b08 100644
--- a/core/modules/user/src/AccountForm.php
+++ b/core/modules/user/src/AccountForm.php
@@ -120,8 +120,11 @@ public function form(array $form, FormStateInterface $form_state) {
if (!$register) {
$form['account']['pass'] = array(
'#type' => 'password_confirm',
+ '#prefix' => '
' . $this->t('Change password') . '
',
+ '#title1' => $this->t('New password'),
+ '#title2' => $this->t('Confirm new password'),
'#size' => 25,
- '#description' => $this->t('To change the current user password, enter the new password in both fields.'),
+ '#description' => $this->t('To change the current user password, enter the new password.'),
);
// To skip the current password field, the user must have logged in via a
@@ -150,11 +153,18 @@ public function form(array $form, FormStateInterface $form_state) {
// The user may only change their own password without their current
// password if they logged in via a one-time login link.
if (!$form_state->get('user_pass_reset')) {
- $form['account']['current_pass']['#description'] = $this->t('Required if you want to change the %mail or %pass below. Reset your password.', array(
+ $form['account']['current_pass']['#description'] = $this->t('Confirm your current password to change the %mail or %pass above. Reset your password.', array(
'%mail' => $form['account']['mail']['#title'],
- '%pass' => $this->t('Password'),
+ '%pass' => $this->t('New password'),
':request_new_url' => $this->url('user.pass'),
));
+ $form['account']['current_pass']['#states'] = [
+ // Only show this field when mail or new password has changed.
+ 'visible' => [
+ [':input[name="mail"]' => ['!value' => $account->getEmail()]],
+ [':input[name="pass[pass1]"]' => ['filled' => TRUE]],
+ ],
+ ];
}
}
}
diff --git a/core/modules/user/src/Tests/UserEditTest.php b/core/modules/user/src/Tests/UserEditTest.php
index 07daeca..18cc860 100644
--- a/core/modules/user/src/Tests/UserEditTest.php
+++ b/core/modules/user/src/Tests/UserEditTest.php
@@ -47,7 +47,7 @@ function testUserEdit() {
$edit = array();
$edit['mail'] = $this->randomMachineName() . '@new.example.com';
$this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save'));
- $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('Email'))));
+ $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Email')));
$edit['current_pass'] = $user1->pass_raw;
$this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save'));
@@ -58,7 +58,7 @@ function testUserEdit() {
$edit['pass[pass1]'] = $new_pass = $this->randomMachineName();
$edit['pass[pass2]'] = $new_pass;
$this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save'));
- $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('Password'))));
+ $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Password')));
// Try again with the current password.
$edit['current_pass'] = $user1->pass_raw;
diff --git a/core/modules/user/src/Tests/UserPasswordResetTest.php b/core/modules/user/src/Tests/UserPasswordResetTest.php
index 420b97a..d62f35a 100644
--- a/core/modules/user/src/Tests/UserPasswordResetTest.php
+++ b/core/modules/user/src/Tests/UserPasswordResetTest.php
@@ -125,7 +125,7 @@ function testUserPasswordReset() {
// Verify that the password reset session has been destroyed.
$this->drupalPostForm(NULL, $edit, t('Save'));
- $this->assertText(t('Your current password is missing or incorrect; it\'s required to change the Password.'), 'Password needed to make profile changes.');
+ $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Password')), 'Password needed to make profile changes.');
// Log out, and try to log in again using the same one-time link.
$this->drupalLogout();