Goal
Restrict users from adding or deleting components in Parsys in Touch UI
Demo | Package Install | Git Hub
Configuration
Stored in CRX
Insert Error
Delete Error
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/eaem-touchui-parsys-restrict-add-remove
2) Create clientlib (type cq:ClientLibraryFolder) /apps/eaem-touchui-parsys-restrict-add-remove/clientlib and set property categories of String[] type to cq.authoring.dialog, cq.compat.authoring.widgets and dependencies to underscore
3) Create file ( type nt:file ) /apps/eaem-touchui-parsys-restrict-add-remove/clientlib/js.txt, add the following
restrict-parsys.js
4) Create file ( type nt:file ) /apps/eaem-touchui-parsys-restrict-add-remove/clientlib/restrict-parsys.js, add the following code
// for touchui design mode
(function(){
var pathName = window.location.pathname,
EAEM_PARSYS_ADD_REMOVE_GROUPS = "eaemParsysAddRemoveGroups";
if( !pathName.endsWith("dialogwrapper.html") ){
return;
}
CQ.Ext.onReady(function () {
findDesignDialogWindow();
});
function findDesignDialogWindow(){
var wMgr = CQ.Ext.WindowMgr, winId;
var W_INTERVAL = setInterval(function () {
wMgr.each(function (win) {
if(!win || !win.id){
return;
}
clearInterval(W_INTERVAL);
addLimitTextField(win);
});
}, 250);
}
function addLimitTextField(win){
var compSelector = win.findByType("componentselector");
if(compSelector.length == 0){
return;
}
compSelector = compSelector[0];
var dialog = compSelector.findParentByType("dialog");
$.ajax( dialog.path + ".2.json" ).done(handler);
function handler(data){
var limitField = new CQ.Ext.form.TextArea({
value: data[EAEM_PARSYS_ADD_REMOVE_GROUPS] || "",
fieldLabel: "Comma Separated Groups for adding/deleting components",
name: "./" + EAEM_PARSYS_ADD_REMOVE_GROUPS,
style: {
marginBottom: '10px'
}
});
compSelector.ownerCt.insert(2, limitField);
compSelector.ownerCt.doLayout();
}
}
}());
// for touchui edit mode
(function ($document, gAuthor) {
var pathName = window.location.pathname;
if( pathName.endsWith("dialogwrapper.html") ){
return;
}
var EAEM_PARSYS_ADD_REMOVE_GROUPS = "eaemParsysAddRemoveGroups",
userGroups = [];
$(extendComponentDrop);
function getDesignPath(editable){
var parsys = editable.getParent();
var designSrc = parsys.config.designDialogSrc, result = {}, param;
designSrc = designSrc.substring(designSrc.indexOf("?") + 1);
designSrc.split(/&/).forEach( function(it) {
if (_.isEmpty(it)) {
return;
}
param = it.split("=");
result[param[0]] = param[1];
});
return decodeURIComponent(result["content"]);
}
function extendComponentDrop(){
var dropController = gAuthor.ui.dropController,
compDragDrop = dropController.get(gAuthor.Component.prototype.getTypeName());
compDragDrop.handleDrop = function(dropFn){
return function (event) {
if(!isAllowed(event.currentDropTarget.targetEditable, "Insert")){
return;
}
return dropFn.call(this, event);
};
}(compDragDrop.handleDrop);
gAuthor.edit.ToolbarActions.INSERT.handler = function eaemOpenInsertDialog(executeDlgFn){
return function (editable) {
if(!isAllowed(editable, "Insert")){
return;
}
return executeDlgFn.call(this, editable);
}
}(gAuthor.edit.ToolbarActions.INSERT.handler);
gAuthor.edit.ToolbarActions.DELETE.handler = function eaemDeleteConfirm(executeDlgFn){
return function (editable, historyConfig) {
if(!isAllowed(editable, "Delete")){
return;
}
return executeDlgFn.call(this, editable, historyConfig);
}
}(gAuthor.edit.ToolbarActions.DELETE.handler);
function isAllowed(editable, action){
if(_.isEmpty(userGroups)){
userGroups = getUserGroups();
}
var allowed = isUserGroupAllowed(editable, userGroups);
if(!allowed){
showErrorAlert(action + " not allowed for user : " + gAuthor.ContentFrame.getUserID());
}
return allowed;
}
}
function isUserGroupAllowed(editable, userGroups){
var path = getDesignPath(editable), isAllowed = false;
$.ajax( { url: path + ".2.json", async: false } ).done(function(data){
if(_.isEmpty(data) || !data[EAEM_PARSYS_ADD_REMOVE_GROUPS]){
isAllowed = true;
return;
}
var groups = data[EAEM_PARSYS_ADD_REMOVE_GROUPS];
if(_.isEmpty(groups)){
isAllowed = true;
return;
}
groups = groups.split(",");
for(var x = 0; x < groups.length; x++ ){
if(userGroups.indexOf(groups[x]) < 0){
continue;
}
isAllowed = true;
break;
}
});
return isAllowed;
}
function getUserGroups(){
var userID = Granite.author.ContentFrame.getUserID();
$.ajax( {
url: "/bin/security/authorizables.json?filter=" + userID,
async: false
} ).done(handler);
function handler(data){
if(!data || !data.authorizables){
return;
}
_.each(data.authorizables, function(authObj){
if( (authObj.id !== userID) || _.isEmpty(authObj.memberOf)){
return;
}
userGroups = _.pluck(authObj.memberOf, "id");
});
}
return userGroups;
}
function showErrorAlert(message, title){
var fui = $(window).adaptTo("foundation-ui"),
options = [{
text: "OK",
warning: true
}];
message = message || "Unknown Error";
title = title || "Error";
fui.prompt(title, message, "error", options);
}
})($(document), Granite.author);