Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.

Enable commenting for reviewers on AEM pages

Avatar

Level 3

Hi everyone,
We have a requirement where a Content Owner / Reviewer is given the authoring URL, they should have the option to turn on annotations, enter a comment, save it and view others annotations.

We had the old forum links which speaks of this, but they are inaccessible now.

https://forums.adobe.com/thread/2325941

https://forums.adobe.com/thread/2325941#10931831

 

If anyone has any suggestions for this, please do share.
Thanks

3 Replies

Avatar

Community Advisor

Hi @Jangra98 ,

To enable commenting and annotations for reviewers on AEM pages, you can leverage AEM's built-in annotation feature or develop a custom solution. Here's a detailed guide on how to achieve this using both approaches:

1. Using AEM Built-in Annotations

AEM provides built-in support for annotations which can be used to comment on pages. Here’s how you can enable and use this feature:

Step-by-Step Guide:

  1. Access AEM Author Instance:

    • Log in to your AEM author instance.
  2. Enable Annotations in Page Editor:

    • Open the page you want to review in the AEM Page Editor.
    • In the top toolbar, you should see an "Annotations" button (it looks like a pencil or speech bubble icon). Click on it to enable annotations.
  3. Add Comments:

    • With annotations enabled, click anywhere on the page where you want to add a comment.
    • A comment box will appear. Enter your comment and save it.
    • Other users with access to the page can view and respond to the annotations.
  4. View and Manage Annotations:

    • You can view all annotations on the page by clicking on the "Annotations" button.
    • To manage annotations, click on each annotation to edit or delete them.

2. Custom Annotation Solution

If you need more advanced features or a custom commenting solution, you might need to develop a custom component. Here’s a high-level approach to creating a custom annotation feature:

Step-by-Step Guide:

  1. Create a Custom Component for Annotations:

    • Define the Component: Create a new component in AEM for annotations, for example, /apps/your-project/components/annotations.

    • Component Dialog: Define a dialog for the component where users can enter their comments.

    • Component Script: Create the HTL (HTML Template Language) script to render the component on the page.

 

<!-- /apps/your-project/components/annotations/annotations.html -->
<div class="annotation-component">
  <h3>Annotations</h3>
  <div id="annotations-list">
    <!-- Annotations will be dynamically loaded here -->
  </div>
  <textarea id="new-annotation" placeholder="Enter your comment"></textarea>
  <button id="save-annotation">Save Comment</button>
</div>

 

Client-Side Javascript&colon; Add JavaScript to handle adding, displaying, and saving comments.

 

// /apps/your-project/components/annotations/clientlibs/js/annotations.js
document.getElementById('save-annotation').addEventListener('click', function() {
    const comment = document.getElementById('new-annotation').value;
    if (comment) {
        // Save the comment to the server
        saveAnnotation(comment);
    }
});

function saveAnnotation(comment) {
    // Implement AJAX call to save the comment to a JCR node or another storage
    // Example: POST request to a custom Sling servlet
}

function loadAnnotations() {
    // Implement AJAX call to load comments from the server
    // Example: GET request to a custom Sling servlet
}

// Load existing annotations when the page loads
loadAnnotations();

 

Create a Custom Sling Servlet:

  • Servlet to Handle CRUD Operations: Create a Sling servlet to handle saving, retrieving, and managing comments.

 

@Component(service = Servlet.class,
           property = {
               Constants.SERVICE_DESCRIPTION + "=Annotation Servlet",
               "sling.servlet.methods=" + HttpConstants.METHOD_POST,
               "sling.servlet.paths=" + "/bin/annotations"
           })
public class AnnotationServlet extends SlingAllMethodsServlet {
    @Reference
    private ResourceResolverFactory resourceResolverFactory;

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
            throws ServletException, IOException {
        // Implement logic to save annotation
    }

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
            throws ServletException, IOException {
        // Implement logic to get annotations
    }
}

 

 

Save Annotations in JCR: Save the annotations in the JCR repository under a specific path.

 

@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
        throws ServletException, IOException {
    String comment = request.getParameter("comment");
    // Save the comment under a specific path in the JCR
    ResourceResolver resolver = request.getResourceResolver();
    Session session = resolver.adaptTo(Session.class);
    try {
        Node rootNode = session.getNode("/content/annotations");
        Node commentNode = rootNode.addNode(UUID.randomUUID().toString(), "nt:unstructured");
        commentNode.setProperty("comment", comment);
        session.save();
        response.getWriter().write("Comment saved");
    } catch (RepositoryException e) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
}

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
        throws ServletException, IOException {
    // Retrieve and return comments
}

 

Register the Component and ClientLibs:

  • ClientLibs Configuration: Configure client libraries to include your JavaScript and CSS files.

 

<!-- /apps/your-project/components/annotations/clientlibs/.content.xml -->
<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0"
          jcr:primaryType="cq:ClientLibraryFolder"
          categories="[annotations]">
    <js>
        <fileName>annotations.js</fileName>
    </js>
    <css>
        <fileName>annotations.css</fileName>
    </css>
</jcr:root>

 

Include the Annotation Component on Pages:

  • Add the annotation component to the pages where reviewers need to comment

 

<!-- Include the annotation component -->
<cq:include path="annotations" resourceType="your-project/components/annotations"/>
​

 


By using AEM's built-in annotations or developing a custom solution, you can enable content owners and reviewers to comment on AEM pages. The built-in feature is straightforward to use and sufficient for basic needs, while a custom solution offers greater flexibility and control over the functionality. Choose the approach that best fits your requirements.

Avatar

Administrator

@Jangra98 Did you find the suggestions from users helpful? Please let us know if you require more information. Otherwise, please mark the answer as correct for posterity. If you've discovered a solution yourself, we would appreciate it if you could share it with the community. Thank you!



Kautuk Sahni