Goal
Disable the Sidekick Activate and Deactivate buttons if logged-in user is not in group administrators. Check the demo and Source code ( not package install )
Solution
1) Code a servlet apps.experienceaem.sidekick.GetUserGroups to return the logged-in user groups. Here is the source
package apps.experienceaem.sidekick; import org.apache.jackrabbit.api.security.user.Group; import org.apache.jackrabbit.api.security.user.User; import org.apache.felix.scr.annotations.sling.SlingServlet; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; import org.apache.sling.commons.json.io.JSONWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletException; import java.io.IOException; import java.util.Iterator; @SlingServlet( paths = "/bin/experienceaem/getgroups", methods = "GET", metatype = false, label = "Get user groups" ) public class GetUserGroups extends SlingAllMethodsServlet { private static final Logger log = LoggerFactory.getLogger(GetUserGroups.class); @Override protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); JSONWriter jw = new JSONWriter(response.getWriter()); try { ResourceResolver resolver = request.getResourceResolver(); User user = resolver.adaptTo(User.class); Iterator<Group> groups = user.memberOf(); jw.object(); jw.key(user.getID()).array(); while(groups.hasNext()){ jw.value(groups.next().getID()); } jw.endArray(); jw.endObject(); } catch (Exception e) { log.error("Error getting groups", e); throw new ServletException(e); } } }
2) Login to CRXDE Lite, create folder (nt:folder) /apps/skdisable
3) Create clientlib (type cq:ClientLibraryFolder) /apps/skdisable/clientlib and set a property categories of String type to cq.widgets
4) Create file ( type nt:file ) /apps/skdisable/clientlib/js.txt, add the following
disable.js
5) Create file ( type nt:file ) /apps/skdisable/clientlib/disable.js, add the following code
(function(){ if( ( window.location.pathname == "/cf" ) || ( window.location.pathname.indexOf("/content") == 0)){ var SK_INTERVAL = setInterval(function(){ var sk = CQ.WCM.getSidekick(); if(sk && sk.panels){ clearInterval(SK_INTERVAL); $.ajax({ url: '/bin/experienceaem/getgroups', dataType: "json", type: 'GET', async: false, success: function(data){ data = data[CQ.User.getCurrentUser().getUserID()]; if(data.indexOf("administrators") !== -1){ return; } var pagePanel = sk.panels["PAGE"]; var buttons = pagePanel.findBy(function(comp){ return comp["name"] == "PUBLISH" || comp["name"] == "DEACTIVATE"; }, pagePanel); CQ.Ext.each(buttons, function(button){ button.setDisabled(true); }); } }); } }, 250); } })();
No comments:
Post a Comment