Skip to content

Commit

Permalink
*8973* refactor JS handlers, move suggestUsername to ApiHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
jnugent committed Oct 28, 2014
1 parent 3a3cf6f commit 756c9ac
Show file tree
Hide file tree
Showing 6 changed files with 171 additions and 110 deletions.
18 changes: 17 additions & 1 deletion controllers/api/user/UserApiHandler.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ function authorize($request, &$args, $roleAssignments) {
import('lib.pkp.classes.security.authorization.PKPSiteAccessPolicy');
$this->addPolicy(new PKPSiteAccessPolicy(
$request,
array('updateUserMessageState'),
array('updateUserMessageState', 'suggestUsername'),
SITE_ACCESS_ALL_ROLES
));
return parent::authorize($request, $args, $roleAssignments);
Expand Down Expand Up @@ -99,6 +99,22 @@ function updateUserMessageState($args, $request) {

}


/**
* Get a suggested username, making sure it's not already used.
* @param $args array
* @param $request PKPRequest
*/
function suggestUsername($args, $request) {
$suggestion = Validation::suggestUsername(
$request->getUserVar('firstName'),
$request->getUserVar('lastName')
);

$json = new JSONMessage(true, $suggestion);
return $json->getString();
}

/**
* Checks the requested setting against a whitelist of
* settings that can be changed remotely.
Expand Down
17 changes: 1 addition & 16 deletions controllers/grid/settings/user/UserGridHandler.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function UserGridHandler() {
ROLE_ID_MANAGER),
array('fetchGrid', 'fetchRow', 'editUser', 'updateUser', 'updateUserRoles',
'editDisableUser', 'disableUser', 'removeUser', 'addUser',
'editEmail', 'sendEmail', 'suggestUsername')
'editEmail', 'sendEmail')
);

$this->addRoleAssignment(array(ROLE_ID_SITE_ADMIN), array('mergeUsers'));
Expand Down Expand Up @@ -249,21 +249,6 @@ function getFilterForm() {
//
// Public grid actions.
//
/**
* Get a suggested username, making sure it's not already used.
* @param $args array
* @param $request PKPRequest
*/
function suggestUsername($args, $request) {
$suggestion = Validation::suggestUsername(
$request->getUserVar('firstName'),
$request->getUserVar('lastName')
);

$json = new JSONMessage(true, $suggestion);
return $json->getString();
}

/**
* Add a new user.
* @param $args array
Expand Down
100 changes: 9 additions & 91 deletions js/controllers/grid/settings/user/form/UserFormHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
/**
* @constructor
*
* @extends $.pkp.controllers.form.AjaxFormHandler
* @extends $.pkp.pages.user.form.UserFormHandler
*
* @param {jQueryObject} $form the wrapped HTML form element.
* @param {Object} options form options.
Expand All @@ -41,8 +41,6 @@
// Attach form elements events.
$('[id^="generatePassword"]', $form).click(
this.callbackWrapper(this.setGenerateRandom));
$('[id^="suggestUsernameButton"]', $form).click(
this.callbackWrapper(this.generateUsername));

// Check the generate password check box.
if ($('[id^="generatePassword"]', $form).attr('checked')) {
Expand All @@ -52,48 +50,12 @@
};
$.pkp.classes.Helper.inherits(
$.pkp.controllers.grid.settings.user.form.UserFormHandler,
$.pkp.controllers.form.AjaxFormHandler);


//
// Private properties
//
/**
* The URL to be called to fetch a username suggestion.
* @private
* @type {string}
*/
$.pkp.controllers.grid.settings.user.form.UserFormHandler.
prototype.fetchUsernameSuggestionUrl_ = '';


/**
* The message that will be displayed if users click on suggest
* username button with no data in lastname.
* @private
* @type {string}
*/
$.pkp.controllers.grid.settings.user.form.UserFormHandler.
prototype.usernameSuggestionTextAlert_ = '';
$.pkp.pages.user.form.UserFormHandler);


//
// Public methods.
//
/**
* @see AjaxFormHandler::submitForm
* @param {Object} validator The validator plug-in.
* @param {HTMLElement} formElement The wrapped HTML form.
*/
$.pkp.controllers.grid.settings.user.form.UserFormHandler.prototype.
submitForm = function(validator, formElement) {

var $form = this.getHtmlElement();
$(':password', $form).removeAttr('disabled');
this.parent('submitForm', validator, formElement);
};


/**
* Event handler that is called when generate password checkbox is
* clicked.
Expand All @@ -108,61 +70,17 @@
passwordValue = '',
activeAndCheck = 0;

if ($checkbox.attr('checked')) {
if ($checkbox.prop('checked')) {
passwordValue = '********';
activeAndCheck = 1;
activeAndCheck = 'disabled';
} else {
passwordValue = '';
activeAndCheck = '';
}
$(':password', $form).
attr('disabled', activeAndCheck).val(passwordValue);
prop('disabled', activeAndCheck).val(passwordValue);
$('[id^="sendNotify"]', $form).attr('disabled', activeAndCheck).
attr('checked', activeAndCheck);
};


/**
* Event handler that is called when the suggest username button is clicked.
*/
$.pkp.controllers.grid.settings.user.form.UserFormHandler.prototype.
generateUsername = function() {

var $form = this.getHtmlElement(),
firstName, lastName, fetchUrl;

if ($('[id^="lastName"]', $form).val() === '') {
// No last name entered; cannot suggest. Complain.
alert(this.usernameSuggestionTextAlert_);
return;
}

// Fetch entered names
firstName = /** @type {string} */ $('[id^="firstName"]', $form).val();
lastName = /** @type {string} */ $('[id^="lastName"]', $form).val();

// Replace dummy values in the URL with entered values
fetchUrl = this.fetchUsernameSuggestionUrl_.
replace('FIRST_NAME_DUMMY', firstName).
replace('LAST_NAME_DUMMY', lastName);

$.get(fetchUrl, this.callbackWrapper(this.setUsername), 'json');
};


/**
* Check JSON message and set it to username, back on form.
* @param {HTMLElement} formElement The Form HTML element.
* @param {JSONType} jsonData The jsonData response.
*/
$.pkp.controllers.grid.settings.user.form.UserFormHandler.prototype.
setUsername = function(formElement, jsonData) {

var processedJsonData = this.handleJson(jsonData),
$form = this.getHtmlElement();

if (processedJsonData === false) {
throw new Error('JSON response must be set to true!');
}

$('[id^="username"]', $form).val(processedJsonData.content);
prop('checked', activeAndCheck);
};


Expand Down
137 changes: 137 additions & 0 deletions js/pages/user/UserFormHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/**
* @defgroup js_pages_user_form User form javascript
*/
/**
* @file js/pages/user/form/UserFormHandler.js
*
* Copyright (c) 2014 Simon Fraser University Library
* Copyright (c) 2000-2014 John Willinsky
* Distributed under the GNU GPL v2. For full terms see the file docs/COPYING.
*
* @class UserFormHandler
* @ingroup js_controllers_pages_user_form
*
* @brief Handle the user registration form.
*/
(function($) {

/** @type {Object} */
$.pkp.pages.user =
$.pkp.pages.user || { form: { } };



/**
* @constructor
*
* @extends $.pkp.controllers.form.AjaxFormHandler
*
* @param {jQueryObject} $form the wrapped HTML form element.
* @param {Object} options form options.
*/
$.pkp.pages.user.form.UserFormHandler =
function($form, options) {

this.parent($form, options);

// Set data to private variables.
this.fetchUsernameSuggestionUrl_ = options.fetchUsernameSuggestionUrl;
this.usernameSuggestionTextAlert_ = options.usernameSuggestionTextAlert;

// Attach form elements events.
$('[id^="suggestUsernameButton"]', $form).click(
this.callbackWrapper(this.generateUsername));
};
$.pkp.classes.Helper.inherits(
$.pkp.pages.user.form.UserFormHandler,
$.pkp.controllers.form.AjaxFormHandler);


//
// Private properties
//
/**
* The URL to be called to fetch a username suggestion.
* @private
* @type {string}
*/
$.pkp.pages.user.form.UserFormHandler.
prototype.fetchUsernameSuggestionUrl_ = '';


/**
* The message that will be displayed if users click on suggest
* username button with no data in lastname.
* @private
* @type {string}
*/
$.pkp.pages.user.form.UserFormHandler.
prototype.usernameSuggestionTextAlert_ = '';


//
// Public methods.
//
/**
* @see AjaxFormHandler::submitForm
* @param {Object} validator The validator plug-in.
* @param {HTMLElement} formElement The wrapped HTML form.
*/
$.pkp.pages.user.form.UserFormHandler.prototype.
submitForm = function(validator, formElement) {

var $form = this.getHtmlElement();
$(':password', $form).removeAttr('disabled');
this.parent('submitForm', validator, formElement);
};


/**
* Event handler that is called when the suggest username button is clicked.
*/
$.pkp.pages.user.form.UserFormHandler.prototype.
generateUsername = function() {

var $form = this.getHtmlElement(),
firstName, lastName, fetchUrl;

if ($('[id^="lastName"]', $form).val() === '') {
// No last name entered; cannot suggest. Complain.
alert(this.usernameSuggestionTextAlert_);
return;
}

// Fetch entered names
firstName = /** @type {string} */ $('[id^="firstName"]', $form).val();
lastName = /** @type {string} */ $('[id^="lastName"]', $form).val();

// Replace dummy values in the URL with entered values
fetchUrl = this.fetchUsernameSuggestionUrl_.
replace('FIRST_NAME_DUMMY', firstName).
replace('LAST_NAME_DUMMY', lastName);

$.get(fetchUrl, this.callbackWrapper(this.setUsername), 'json');
};


/**
* Check JSON message and set it to username, back on form.
* @param {HTMLElement} formElement The Form HTML element.
* @param {JSONType} jsonData The jsonData response.
*/
$.pkp.pages.user.form.UserFormHandler.prototype.
setUsername = function(formElement, jsonData) {

var processedJsonData = this.handleJson(jsonData),
$form = this.getHtmlElement();

if (processedJsonData === false) {
throw new Error('JSON response must be set to true!');
}

$('[id^="username"]', $form).val(processedJsonData.content);
};


/** @param {jQuery} $ jQuery closure. */
}(jQuery));
2 changes: 1 addition & 1 deletion templates/controllers/grid/settings/user/form/userForm.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// Attach the form handler.
$('#userForm').pkpHandler('$.pkp.controllers.grid.settings.user.form.UserFormHandler',
{ldelim}
fetchUsernameSuggestionUrl: '{url|escape:"javascript" router=$smarty.const.ROUTE_COMPONENT component="grid.settings.user.UserGridHandler" op="suggestUsername" firstName="FIRST_NAME_DUMMY" lastName="LAST_NAME_DUMMY" escape=false}',
fetchUsernameSuggestionUrl: '{url|escape:"javascript" router=$smarty.const.ROUTE_COMPONENT component="api.user.UserApiHandler" op="suggestUsername" firstName="FIRST_NAME_DUMMY" lastName="LAST_NAME_DUMMY" escape=false}',
usernameSuggestionTextAlert: '{translate key="grid.user.mustProvideName"}'
{rdelim}
);
Expand Down
7 changes: 6 additions & 1 deletion templates/user/register.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@
<script type="text/javascript">
$(function() {ldelim}
// Attach the form handler.
$('#register').pkpHandler('$.pkp.controllers.form.FormHandler');
$('#register').pkpHandler('$.pkp.pages.user.form.UserFormHandler',
{ldelim}
fetchUsernameSuggestionUrl: '{url|escape:"javascript" router=$smarty.const.ROUTE_COMPONENT component="api.user.UserApiHandler" op="suggestUsername" firstName="FIRST_NAME_DUMMY" lastName="LAST_NAME_DUMMY" escape=false}',
usernameSuggestionTextAlert: '{translate key="grid.user.mustProvideName"}'
{rdelim}
);
{rdelim});
</script>

Expand Down

0 comments on commit 756c9ac

Please sign in to comment.