Friday, August 3, 2018

AEM 61 Touch UI Add New Fields to User Editor Save to Profile

AEM 61 Touch UI Add New Fields to User Editor Save to Profile


Goal


Extend User Editor - http://localhost:4502/libs/granite/security/content/userEditor.html to add new fields to the form, saved to user profile node in CRX eg. Textfield for Alternate Email

For Classic UI, check this post

Demo | Package Install


Field Alternate Email



Alternate Email TextField in User Editor



Alternate Email saved to User Profile



Solution


1) Login to CRXDE Lite, create folder (nt:folder) /apps/touchui-usereditor-new-field

2) Create /apps/touchui-usereditor-new-field/content of type sling:Folder

3) Add new fields (one or more) in a node structure (similar to authoring dialogs) in /apps/touchui-usereditor-new-field/content/addn-details eg. the nodes as xml for new textfield Alternate Email

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/foundation/container"
class="well user-details-sections-margin user-editor-container">
<layout
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/foundation/layouts/well"/>
<items jcr_primaryType="nt:unstructured">
<alt-email
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/foundation/form/textfield"
class="save-button-enabler"
fieldLabel="Alternate Email"
name="./profile/alt-email"/>
</items>
</jcr:root>

4) Fields in content node /apps/touchui-usereditor-new-field/content/addn-details are added to the user editor by clientlib logic explained in next steps...

5) Create clientlib (type cq:ClientLibraryFolder/apps/touchui-usereditor-new-field/clientlib and set a property categories of String type to granite.securityCUI and dependencies String[] underscore

6) Create file ( type nt:file ) /apps/touchui-usereditor-new-field/clientlib/js.txt, add the following

                         fields.js

7) Create file ( type nt:file ) /apps/touchui-usereditor-new-field/clientlib/fields.js, add the following code

(function ($, document) {
"use strict";

var USER_EDITOR_CONTAINER = ".user-editor-container",
USER_ADMIN_CLEAR = ".user-admin-clear",
USER_EDITOR_URL = "/libs/granite/security/content/userEditor.html",
ADD_DETAILS_CONTENT_URL = "/apps/touchui-usereditor-new-field/content/addn-details";

getAdditionalFields();

function getAdditionalFields(){
$.ajax( { url: ADD_DETAILS_CONTENT_URL + ".html", dataType: html}).done(handler);

function handler(data){
if(_.isEmpty(data)){
return;
}

var $fields = ($(data)).children();

$fields.insertBefore($(USER_EDITOR_CONTAINER).find(USER_ADMIN_CLEAR));

fillAdditionalFields($fields);
}
}

function fillAdditionalFields($fields){
if(_.isEmpty($fields)){
return;
}

var url = document.location.pathname;

url = url.substring(USER_EDITOR_URL.length);

$.ajax(url + "/profile.json").done(handler);

function handler(data){
if(_.isEmpty(data)){
return;
}

var $input, name;

//handles input types only, add additional logic for other types like checkbox...
$fields.each(function(i, field){
$input = $(field).find("input");

name = $input.attr("name");

name = getStringAfterLastSlash(name);

$input.val(data[name]);
});
}
}

function getStringAfterLastSlash(str){
if(!str || (str.indexOf("/") == -1)){
return str;
}

return str.substr(str.lastIndexOf("/") + 1);
}
})(jQuery, document);





visit link download