package com.psddev.cms.tool.search; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.UUID; import com.psddev.cms.db.Localization; import com.psddev.cms.db.Site; import com.psddev.cms.db.Taxon; import com.psddev.cms.tool.Search; import com.psddev.cms.tool.SearchResultItem; import com.psddev.cms.tool.ToolPageContext; import com.psddev.dari.db.ObjectType; import com.psddev.dari.db.Predicate; import com.psddev.dari.db.PredicateParser; import com.psddev.dari.db.Query; import com.psddev.dari.util.ObjectUtils; public class TaxonomySearchResultView extends AbstractSearchResultView { private static final String PARENT_ID_PARAMETER = "taxonomyParentId"; @Override public String getIconName() { return "folder-open"; } @Override public String getDisplayName() { return Localization.currentUserText(this, "displayName"); } @Override public boolean isSupported(Search search) { ObjectType selectedType = search.getSelectedType(); if (selectedType != null && selectedType.getGroups().contains(Taxon.class.getName()) && ObjectUtils.isBlank(search.getQueryString()) && search.getVisibilities().isEmpty()) { @SuppressWarnings("unchecked") Class<? extends Taxon> taxonClass = (Class<? extends Taxon>) search.getSelectedType().getObjectClass(); if (!Taxon.Static.getRoots(taxonClass).isEmpty()) { return true; } } return false; } @Override public boolean isPreferred(Search search) { return isSupported(search); } private Taxon findParent(ToolPageContext page) { return Query .from(Taxon.class) .where("_id = ?", page.param(UUID.class, PARENT_ID_PARAMETER)) .first(); } @Override public boolean isHtmlWrapped( Search search, ToolPageContext page, SearchResultItem itemWriter) { return findParent(page) == null; } @Override protected void doWriteHtml() throws IOException { search.setSuggestions(false); Collection<? extends Taxon> items; Site site = page.getSite(); Predicate predicate = search.toQuery(site).getPredicate(); Taxon parent = findParent(page); if (parent == null) { @SuppressWarnings("unchecked") Class<? extends Taxon> taxonClass = (Class<? extends Taxon>) search.getSelectedType().getObjectClass(); items = Taxon.Static.getRoots(taxonClass, site, predicate); } else { items = Taxon.Static.getChildren(parent, predicate); if (site != null && !items.isEmpty()) { for (Iterator<? extends Taxon> i = items.iterator(); i.hasNext();) { Taxon taxon = i.next(); if (!PredicateParser.Static.evaluate(taxon, site.itemsPredicate())) { i.remove(); } } } } if (!items.isEmpty()) { String target = page.createId(); if (parent == null) { page.writeStart("div", "class", "searchResultTaxonomy"); } page.writeStart("div", "class", "searchResultTaxonomyColumn"); page.writeStart("ul"); for (Taxon item : items) { page.writeStart("li"); if (item.as(Taxon.Data.class).isSelectable()) { itemWriter.writeBeforeHtml(page, search, item); } String altLabel = item.as(Taxon.Data.class).getAltLabel(); if (ObjectUtils.isBlank(altLabel)) { page.writeObjectLabel(item); } else { String visibilityLabel = item.getState().getVisibilityLabel(); if (!ObjectUtils.isBlank(visibilityLabel)) { page.writeStart("span", "class", "visibilityLabel"); page.writeHtml(visibilityLabel); page.writeEnd(); page.writeHtml(" "); } page.writeHtml(altLabel); } if (item.as(Taxon.Data.class).isSelectable()) { itemWriter.writeAfterHtml(page, search, item); } boolean childrenEmpty; if (page.getCmsTool().isUseOldTaxonomyChildrenDetection()) { Collection<? extends Taxon> children = Taxon.Static.getChildren(item, predicate); childrenEmpty = children == null || children.isEmpty(); } else { childrenEmpty = item.as(Taxon.Data.class).isChildrenEmpty(); } if (!childrenEmpty) { page.writeStart("a", "class", "searchResultTaxonomyExpand", "target", target, "href", page.url("", PARENT_ID_PARAMETER, item.getState().getId())); page.writeEnd(); } page.writeEnd(); } page.writeEnd(); page.writeEnd(); page.writeStart("div", "class", "frame searchResultTaxonomyChildren", "name", target); page.writeEnd(); if (parent == null) { page.writeEnd(); } } } }