Quantcast
Channel: Experiencing Adobe Experience Manager (AEM, CQ)
Viewing all articles
Browse latest Browse all 525

AEM 6420 - Alphabetically sort tags in Tag picker column view

$
0
0

Goal


Sort the tags alphabetically, in tags picker column view

Demo | Package Install | Source Code | Github


Product



Extension



Solution


1) Create a Sling Filter to intercept request URIs starting with /mnt/overlay/cq/gui/content/coral/common/form/tagfield/picker.*, use a sling servlet request wrapper TagSortSlingServletRequestWrapper to return a sorted datasource iterator

package apps.experienceaem.assets;

import com.adobe.granite.ui.components.ds.AbstractDataSource;
import com.adobe.granite.ui.components.ds.DataSource;
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.resource.Resource;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;

import javax.servlet.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

@Component( description = "Experience AEM Request filter for libs.cq.gui.components.coral.common.form.tagfield.datasources.children",
label = "Experience AEM Tags Sort Filter")
@Service({Filter.class})
@Properties({
@Property(name = "sling.filter.scope", value = {"REQUEST"}, propertyPrivate = true),
@Property( name = "sling.filter.pattern",
value = {"/mnt/overlay/cq/gui/content/coral/common/form/tagfield/picker.*"},
propertyPrivate = true),
@Property(name = "service.ranking", intValue = {-99}, propertyPrivate = true)})
public class EAEMTagsSortFilter implements Filter {
public static String DATA_SOURCE_NAME = DataSource.class.getName();

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(new TagSortSlingServletRequestWrapper((SlingHttpServletRequest)request), response);
}

@Override
public void destroy() {
}

private class TagSortSlingServletRequestWrapper extends SlingHttpServletRequestWrapper {
public TagSortSlingServletRequestWrapper(final SlingHttpServletRequest request) {
super(request);
}

@Override
public Object getAttribute(String attrName) {
if(!EAEMTagsSortFilter.DATA_SOURCE_NAME.equals(attrName)){
return super.getAttribute(attrName);
}

DataSource ds = (DataSource)super.getAttribute(attrName);

if(ds == null){
return ds;
}

final List<Resource> sortedList = new ArrayList<Resource>();
Iterator<Resource> items = ds.iterator();

while(items.hasNext()){
sortedList.add(items.next());
}

//sortedList.sort(Comparator.comparing(Resource::getName));

sortedList.sort(Comparator.comparing(Resource::getValueMap, (v1, v2) -> {
return v1.get("jcr:title", "").compareTo(v2.get("jcr:title", ""));
}));

ds = new AbstractDataSource() {
public Iterator<Resource> iterator() {
return sortedList.iterator();
}
};

return ds;
}
}
}



Viewing all articles
Browse latest Browse all 525

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>