Goal
In all 3 views (Card, List, Column) of Assets UI, set Default Sort by column to Name. Configure the Name and Type columns to be sortable in List View
Use sling.filter.scope=COMPONENT and the following regex for sling.filter.pattern to apply default name sort when browsing folders or bookmarked urls (eg. /assets.html/content/dam/experience-aem)
"^((\\/assets\\.html\\/content\\/dam)|(\\/mnt\\/overlay\\/dam\\/gui\\/content\\/assets\\/jcr:content\\/views\\/)).*$"
For Sites Console check this post
Demo | Source Code | Package Install | Github
Extension
List view Sort by Name
Solution
1) Login to CRXDe Lite, overlay the name and type nodes of /libs/dam/gui/content/commons/availablecolumns, set the property sortable=true
/apps/dam/gui/content/commons/availablecolumns/name
/apps/dam/gui/content/commons/availablecolumns/type
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="nt:unstructured">
<name
jcr:primaryType="nt:unstructured"
jcr:title="Name"
configurable="{Boolean}false"
default="{Boolean}true"
sortable="{Boolean}true"/>
<type
jcr:primaryType="nt:unstructured"
jcr:title="Type"
columnGroup="metadata"
default="{Boolean}true"
sortable="{Boolean}true"/>
</jcr:root>
2) Create a Sling Filter to intercept request URIs starting with /mnt/overlay/dam/gui/content/assets/jcr:content/views, set the sort property to name if sortName parameter is empty (overriding the default orderby=@jcr:created with orderby=nodename). NameSortSlingServletRequestWrapper, a sling request wrapper in the filter returns name if sortName parameter value is empty
package apps.experienceaem.assets;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import java.io.IOException;
@Component(
metatype = true,
description = "Experience AEM Request filter for AssetsDataSourceServlet",
label = "EAEM Datasource Sort Filter")
@Service({Filter.class})
@Properties({
@Property(name = "sling.filter.scope",value = {"REQUEST"},propertyPrivate = true),
@Property( name = "sling.filter.pattern",
value = {"/mnt/overlay/dam/gui/content/assets/jcr:content/views/.*"},
propertyPrivate = true),
@Property(name = "service.ranking",intValue = {-99},propertyPrivate = true)})
public class EAEMAssetDataSourceFilter implements Filter {
private static Logger log = LoggerFactory.getLogger(EAEMAssetDataSourceFilter.class);
public static String SORT_NAME = "sortName";
public static String SORT_NAME_NAME = "name";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest)request;
String orderBy = slingRequest.getParameter(SORT_NAME);
if(StringUtils.isNotEmpty(orderBy)){
chain.doFilter(request, response);
return;
}
SlingHttpServletRequest nameSortRequest = new NameSortSlingServletRequestWrapper(slingRequest);
chain.doFilter(nameSortRequest, response);
}
@Override
public void destroy() {
}
private class NameSortSlingServletRequestWrapper extends SlingHttpServletRequestWrapper {
public NameSortSlingServletRequestWrapper(final SlingHttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String paramName) {
if(!EAEMAssetDataSourceFilter.SORT_NAME.equals(paramName)){
return super.getParameter(paramName);
}
return EAEMAssetDataSourceFilter.SORT_NAME_NAME;
}
}
}
3) To sort by case ignored extend predicate com.day.cq.search.eval.NodenamePredicateEvaluator
import com.day.cq.search.Predicate;
import com.day.cq.search.eval.EvaluationContext;
import com.day.cq.search.eval.NodenamePredicateEvaluator;
import org.apache.jackrabbit.util.Text;
import org.osgi.service.component.annotations.Component;
import javax.jcr.query.Row;
import java.util.Comparator;
@Component(
factory = "com.day.cq.search.eval.PredicateEvaluator/nodename"
)
public class IgnoreCasePedicateEvaluator extends NodenamePredicateEvaluator {
/*public String[] getOrderByProperties(Predicate p, EvaluationContext context) {
// com.day.cq.search.eval.XPath.getPropertyPath() converts fn:upper-case(@jcr:path) to @fn:upper-case_x0028__x0040_jcr:path_x0029_
// making this piece unusable
List<String> orderProps = new ArrayList<String>();
orderProps.add("fn:upper-case(@jcr:path)");
return orderProps.toArray(new String[0]);
}*/
public Comparator<Row> getOrderByComparator(Predicate predicate, final EvaluationContext context) {
return new Comparator<Row>() {
public int compare(Row r1, Row r2) {
String path1 = context.getPath(r1);
if(path1 == null) {
return 0;
}
String path2 = context.getPath(r2);
if(path2 == null){
return 0;
}
return Text.getName(path1).compareToIgnoreCase(Text.getName(path2));
}
};
}
}


Will it work for aem 6.3 sp1 cfp2
ReplyDelete