Add username suggestion based on patron name rel_2_2_tadl_post_upgrade rel_2_2_tadl_user_edit_work
authorJeff Godin <jgodin@tadl.org>
Wed, 30 Oct 2013 20:52:19 +0000 (16:52 -0400)
committerJeff Godin <jgodin@tadl.org>
Wed, 30 Oct 2013 20:52:19 +0000 (16:52 -0400)
Add support for suggesting a username based on the patron's first
and last name.

Currently, the scheme for suggestion is a lowercased first initial +
last name, with any characters other than [a-z] removed.

No effort is made to suggest an available username, but if the
suggested username is already in use, the standard "username in use"
message is displayed next to the username field.

Staff can initiate the username suggestion by clicking the new
button next to the username field, and usernames are automatically
suggested when loading a staged user.

Signed-off-by: Jeff Godin <jgodin@tadl.org>
Open-ILS/web/js/ui/default/actor/user/register.js

index 4d3d0b5..21d9e94 100644 (file)
@@ -199,6 +199,7 @@ function load() {
 
     uEditCloneCopyAddr = orgSettings['circ.patron_edit.clone.copy_address'];
     uEditUsePhonePw = orgSettings['patron.password.use_phone'];
+    uEditStagedAutoUsrname = true; // TODO: This can become an org setting
     uEditFetchUserSettings(userId);
 
     if(userId) {
@@ -247,6 +248,8 @@ function load() {
     checkGrpAppPerm(); // to do the initial load
     loadStaticFields();
 
+    // Trigger a username check if this is a staged user
+    if (stageUser) findWidget('au', 'usrname').widget.onChange();
 
     if(patron.isnew() && patron.addresses().length == 0) 
         uEditNewAddr(null, uEditAddrVirtId, true);
@@ -489,6 +492,17 @@ function generatePasswordHandler() {
 }
 
 /**
+ * Generate a potential usrname for the patron.
+ */
+function generateUsrname(first, last) {
+    var candidate;
+    candidate = first.substring(0,1) + last;
+    candidate = candidate.toLowerCase();
+    candidate = candidate.replace(/[^a-z]/g, '');
+    return candidate;
+}
+
+/**
  * Set Expire Date field based on today and current profile group
  */
 function setExpireDateHandler() {
@@ -539,6 +553,12 @@ function uEditLoadStageUser(stageUname) {
         patron['usrname']('');
     }
 
+    // Generate a username if configured to do so and usrname is empty
+    if (patron['usrname']() == '' && uEditStagedAutoUsrname) {
+        var genUsrname = generateUsrname(patron['first_given_name'](), patron['family_name']());
+        patron['usrname'](genUsrname);
+    }
+
     // copy the data into our new address objects
     // TODO: uses the first mailing address only
     if(data.mailing_addresses.length) {
@@ -1016,6 +1036,17 @@ function fleshFMRow(row, fmcls, args) {
             uGenerateInvalidatorWidget(span, fmfield);
             ftd.appendChild(span);
         }
+
+    }
+
+    if (fmcls == "au" && fmfield == "usrname") {
+        var span = dojo.create(
+            "span", {
+                "id": "wrap_usrname"
+            }
+        );
+        uGenerateUsrnameWidget(span);
+        ftd.appendChild(span);
     }
 
     var span = document.createElement('span');
@@ -1931,6 +1962,25 @@ function uGenerateInvalidatorWidget(container_node, field) {
     );
 }
 
+function uGenerateUsrnameWidget(container_node) {
+    new dijit.form.Button(
+        {
+            "label": "Suggest Username",
+            "scrollOnFocus": false,
+            "onClick": function() {
+                var fname = findWidget("au", "first_given_name").widget.attr("value");
+                var lname = findWidget("au", "family_name").widget.attr("value");
+
+                var genUsrname = generateUsrname(fname, lname);
+
+                var f = findWidget("au", "usrname");
+
+                f.widget.attr("value", genUsrname);
+            }
+        }, dojo.create("span", null, container_node, "only")
+    );
+}
+
 function uEditRemoveStage() {
     var resp = fieldmapper.standardRequest(
         ['open-ils.actor', 'open-ils.actor.user.stage.delete'],