You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2023/08/26 17:34:28 UTC
[sling-org-apache-sling-app-cms] branch master updated: SLING-12012 - Add Recent Drafts List
This is an automated email from the ASF dual-hosted git repository.
dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git
The following commit(s) were added to refs/heads/master by this push:
new 3cf0bd30 SLING-12012 - Add Recent Drafts List
3cf0bd30 is described below
commit 3cf0bd3088bd936321f6cbeeff61fe9bd03012d1
Author: Dan Klco <kl...@adobe.com>
AuthorDate: Sat Aug 26 13:34:17 2023 -0400
SLING-12012 - Add Recent Drafts List
---
.../apache/sling/cms/core/models/StartContent.java | 93 ++++++++--------------
.../apache/sling/cms/core/models/package-info.java | 2 +-
.../components/cms/startcontent/startcontent.jsp | 29 +++++++
3 files changed, 64 insertions(+), 60 deletions(-)
diff --git a/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java b/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
index e1f4cdcc..b8ced570 100644
--- a/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
+++ b/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
@@ -22,22 +22,16 @@
*/
package org.apache.sling.cms.core.models;
-import java.util.ArrayList;
-import java.util.Date;
+import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
-import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
import javax.jcr.query.Query;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.Row;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
@@ -56,8 +50,8 @@ public class StartContent {
private static final Logger log = LoggerFactory.getLogger(StartContent.class);
- private ResourceResolver resolver;
- private String term;
+ private final ResourceResolver resolver;
+ private final String term;
public StartContent(SlingHttpServletRequest request) {
this.resolver = request.getResourceResolver();
@@ -65,63 +59,44 @@ public class StartContent {
}
public List<Resource> getRelatedContent() {
- return get10Related(resolver, term).sorted((o1, o2) -> {
- try {
- return (int) ((o1.getScore() - o2.getScore()) * 100);
- } catch (RepositoryException e) {
- log.warn("Exception getting score", e);
- return 0;
- }
- }).limit(9).map(row -> {
- try {
- return resolver.getResource(row.getPath());
- } catch (RepositoryException e) {
- log.warn("Failed to get resource", e);
- return null;
- }
- }).filter(Objects::nonNull).collect(Collectors.toList());
+ return getTenResults(
+ "SELECT * FROM [nt:hierarchyNode] AS s WHERE ISDESCENDANTNODE([/content]) AND CONTAINS(s.*,'"
+ + escape(term.replaceAll("[\\Q+-&|!(){}[]^\"~*?:\\/\\E]", "")) + "')");
}
+ public List<Resource> getRecentDrafts() {
+ return Stream.concat(getTenResults("SELECT * FROM [sling:Page] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+ + escape(resolver.getUserID())
+ + "' AND ISDESCENDANTNODE([/content]) AND [jcr:content/sling:published] = false ORDER BY [jcr:content/jcr:lastModified] DESC")
+ .stream(),
+ getTenResults("SELECT * FROM [sling:Page] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+ + escape(resolver.getUserID())
+ + "' AND ISDESCENDANTNODE([/content]) AND [jcr:content/sling:published] IS NULL ORDER BY [jcr:content/jcr:lastModified] DESC")
+ .stream())
+ .sorted((r1, r2) -> r2.getValueMap().get("jcr:content/jcr:lastModified", Calendar.class)
+ .compareTo(r1.getValueMap().get("jcr:content/jcr:lastModified", Calendar.class))
+
+ ).limit(10).collect(Collectors.toList());
+ }
+
public List<Resource> getRecentContent() {
- return get10Recent(resolver).sorted((o1, o2) -> o1.getValueMap().get("jcr:content/jcr:lastModified", new Date())
- .compareTo(o2.getValueMap().get("jcr:content/jcr:lastModified", new Date())) * -1)
- .limit(10).collect(Collectors.toList());
+ return getTenResults(
+ "SELECT * FROM [nt:hierarchyNode] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+ + escape(resolver.getUserID())
+ + "' AND ISDESCENDANTNODE([/content]) ORDER BY [jcr:content/jcr:lastModified] DESC");
}
- private Stream<Resource> get10Recent(ResourceResolver resolver) {
- Iterator<Resource> it = resolver.findResources(
- "SELECT * FROM [nt:hierarchyNode] WHERE [jcr:content/jcr:lastModifiedBy] = '" + resolver.getUserID()
- + "' AND ISDESCENDANTNODE([/content]) ORDER BY [jcr:content/jcr:lastModified] DESC",
- Query.JCR_SQL2);
- return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.NONNULL), false).limit(10);
+ private String escape(String str) {
+ return str.replace("'", "''");
}
- private Stream<Row> get10Related(ResourceResolver resolver, String term) {
- Session session = resolver.adaptTo(Session.class);
- if (session != null) {
- try {
- Query query = session.getWorkspace().getQueryManager()
- .createQuery(
- "SELECT * FROM [nt:hierarchyNode] AS s WHERE ISDESCENDANTNODE([/content]) AND CONTAINS(s.*,'"
- + term.replace("'", "''") + "')",
- Query.JCR_SQL2);
- query.setLimit(10);
- QueryResult result = query.execute();
- @SuppressWarnings("unchecked")
- Iterable<Row> iterable = () -> {
- try {
- return result.getRows();
- } catch (RepositoryException e) {
- log.warn("Failed to get iterator", e);
- }
- return null;
- };
- return StreamSupport.stream(iterable.spliterator(), false).limit(10);
- } catch (RepositoryException e) {
- log.warn("Exception searching for related content", e);
- }
- }
- return new ArrayList<Row>().stream();
+ private List<Resource> getTenResults(String query) {
+ log.debug("Executing query: {}", query);
+ Iterator<Resource> it = resolver.findResources(query,
+ Query.JCR_SQL2);
+ return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.NONNULL), false).limit(10)
+ .collect(Collectors.toList());
}
+
}
diff --git a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
index b12001cd..8ef992ee 100644
--- a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
+++ b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
@@ -20,7 +20,7 @@
/**
* Package with all of the core models used to support the Sling reference CMS
*/
-@Version("5.0.0")
+@Version("5.1.0")
package org.apache.sling.cms.core.models;
import org.osgi.annotation.versioning.Version;
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
index 65a71d48..79a74d49 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
@@ -50,6 +50,35 @@
</a>
</c:forEach>
</nav>
+ <fmt:message key="Recent Drafts" var="recentDraftsMessage" />
+ <nav class="panel has-background-white" aria-label="${recentDraftsMessage}">
+ <p class="panel-heading">
+ ${recentDraftsMessage}
+ </p>
+ <c:forEach var="item" items="${startContent.recentDrafts}">
+ <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${sling:encode(item.parent.path,'HTML_ATTR')}?resource=${sling:encode(item.path,'HTML_ATTR')}">
+ <span class="panel-icon">
+ <c:choose>
+ <c:when test="${item.resourceType == 'sling:Page'}">
+ <i class="jam jam-document" aria-hidden="true"></i>
+ </c:when>
+ <c:otherwise>
+ <i class="jam jam-file" aria-hidden="true"></i>
+ </c:otherwise>
+ </c:choose>
+ </span>
+ <c:choose>
+ <c:when test="${item.resourceType == 'sling:Page'}">
+ <sling:encode value="${item.valueMap['jcr:content/jcr:title']}" default="${item.name}" mode="HTML" />
+ </c:when>
+ <c:otherwise>
+ <sling:encode value="${item.name}" mode="HTML" />
+ </c:otherwise>
+ </c:choose> —
+ <small><fmt:formatDate value="${item.valueMap['jcr:content/jcr:lastModified'].time}" type="both" dateStyle="short" timeStyle="short" /></small>
+ </a>
+ </c:forEach>
+ </nav>
</div>
<div class="column">
<nav class="panel has-background-white">