Users: enable admins to send users a reset password link.

Add a feature so Admins can send users a 'password reset' email. This doesn't change the password or force a password change. It only emails the user the password reset link.

The feature appears in several places:
* A "Send Reset Link" button on user profile screen.
* A "Send password reset" option in the user list bulk action dropdown.
* A "Send password reset" quick action when hovering over a username in the user list.

Props Ipstenu, DrewAPicture, eventualo, wonderboymusic, knutsp, ericlewis, afercia, JoshuaWold, johnbillion, paaljoachim, hedgefield.
Fixes #34281.



git-svn-id: https://develop.svn.wordpress.org/trunk@50129 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Adam Silverstein
2021-02-01 22:11:46 +00:00
parent c2bc4dfa61
commit 193a5dae21
9 changed files with 354 additions and 158 deletions
+64 -1
View File
@@ -2,7 +2,7 @@
* @output wp-admin/js/user-profile.js
*/
/* global ajaxurl, pwsL10n */
/* global ajaxurl, pwsL10n, userProfileL10n */
(function($) {
var updateLock = false,
__ = wp.i18n.__,
@@ -91,6 +91,68 @@
});
}
/**
* Handle the password reset button. Sets up an ajax callback to trigger sending
* a password reset email.
*/
function bindPasswordRestLink() {
$( '#generate-reset-link' ).on( 'click', function() {
var $this = $(this),
data = {
'user_id': userProfileL10n.user_id, // The user to send a reset to.
'nonce': userProfileL10n.nonce // Nonce to validate the action.
};
// Remove any previous error messages.
$this.parent().find( '.notice-error' ).remove();
// Send the reset request.
var resetAction = wp.ajax.post( 'send-password-reset', data );
// Handle reset success.
resetAction.done( function( response ) {
addInlineNotice( $this, true, response );
} );
// Handle reset failure.
resetAction.fail( function( response ) {
addInlineNotice( $this, false, response );
} );
});
}
/**
* Helper function to insert an inline notice of success or failure.
*
* @param {jQuery Object} $this The button element: the message will be inserted
* above this button
* @param {bool} success Whether the message is a success message.
* @param {string} message The message to insert.
*/
function addInlineNotice( $this, success, message ) {
var resultDiv = $( '<div />' );
// Set up the notice div.
resultDiv.addClass( 'notice inline' );
// Add a class indicating success or failure.
resultDiv.addClass( 'notice-' + ( success ? 'success' : 'error' ) );
// Add the message, wrapping in a p tag, with a fadein to highlight each message.
resultDiv.text( $( $.parseHTML( message ) ).text() ).wrapInner( '<p />');
// Disable the button when the callback has succeeded.
$this.prop( 'disabled', success );
// Remove any previous notices.
$this.siblings( '.notice' ).remove();
// Insert the notice.
$this.before( resultDiv );
}
function bindPasswordForm() {
var $generateButton,
$cancelButton;
@@ -369,6 +431,7 @@
});
bindPasswordForm();
bindPasswordRestLink();
});
$( '#destroy-sessions' ).on( 'click', function( e ) {