package com.psddev.cms.tool.page;
import com.psddev.cms.db.Site;
import com.psddev.cms.tool.PageServlet;
import com.psddev.cms.tool.Search;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.db.Query;
import com.psddev.dari.db.State;
import com.psddev.dari.util.ObjectUtils;
import com.psddev.dari.util.PaginatedResult;
import com.psddev.dari.util.RoutingFilter;
import com.psddev.dari.util.StorageItem;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@RoutingFilter.Path(application = "cms", value = "/searchCarousel")
public class SearchCarousel extends PageServlet {
@Override
protected String getPermissionId() {
return null;
}
@Override
protected void doService(ToolPageContext page) throws IOException, ServletException {
Search search = new Search();
String searchString = page.param(String.class, "search");
Long searchOffset = page.param(Long.class, Search.OFFSET_PARAMETER);
search.getState().putAll((Map<String, Object>) ObjectUtils.fromJson(searchString));
if (searchOffset != null) {
search.setOffset(searchOffset);
}
Query<?> searchQuery = search.toQuery(page.getSite());
UUID currentDraftId = page.param(UUID.class, "draftId");
if (currentDraftId != null) {
searchQuery.and("id != ?", currentDraftId);
}
PaginatedResult<?> result = searchQuery.select(search.getOffset(), search.getLimit());
List<Object> items = new ArrayList<>();
for (Object resultItem : result.getItems()) {
items.add(resultItem);
}
UUID currentContentId = page.param(UUID.class, "id");
boolean included = true;
if (searchOffset == null) { // only splice in the current object if this is the initial page and the current object isn't in the result list
Object currentContent = null;
if (currentDraftId != null) {
currentContent = Query.fromAll().where("id = ?", currentDraftId).first();
} else if (currentContentId != null) {
currentContent = Query.fromAll().where("id = ?", currentContentId).first();
}
if (currentContent != null && !items.contains(currentContent)) {
included = false;
items.add(0, currentContent);
}
}
if (items.size() <= 1 && !result.hasPrevious()) {
return;
}
page.writeStart("div", "class", "widget-searchCarousel",
"data-next-page", result.hasNext() ? page.url("", Search.OFFSET_PARAMETER, result.getNextOffset()) : "",
"data-prev-page", result.hasPrevious() ? page.url("", Search.OFFSET_PARAMETER, result.getPreviousOffset()) : "",
"data-start-index", search.getOffset());
for (Object item : items) {
State itemState = State.getInstance(item);
UUID itemId = itemState.getId();
StorageItem itemPreview = item instanceof SearchCarouselPreviewable
? ((SearchCarouselPreviewable) item).getSearchCarouselPreview()
: itemState.getPreview();
boolean selected = itemId.equals(currentContentId) || itemId.equals(currentDraftId);
page.writeStart("a",
"class", (selected ? "widget-searchCarousel-item-selected" + (included ? "" : " notIncluded") : null),
"data-objectId", itemState.getId(),
"target", "_top",
"href", page.objectUrl("/content/edit.jsp", item,
"search", selected ? null : ObjectUtils.toJson(search.getState().getSimpleValues())));
boolean itemPreviewImage = false;
if (itemPreview != null) {
String previewContentType = itemPreview.getContentType();
if (previewContentType != null && previewContentType.startsWith("image/")) {
itemPreviewImage = true;
}
}
if (itemPreviewImage) {
Site owner = itemState.as(Site.ObjectModification.class).getOwner();
page.writeStart("figure");
page.writeElement("img",
"src", page.getPreviewThumbnailUrl(itemPreview),
"alt", ((owner != null ? (page.getObjectLabel(owner) + ": ") : "")
+ (page.getTypeLabel(item) + ": ") + page.getObjectLabel(item)));
page.writeStart("figcaption");
page.writeTypeObjectLabel(item);
page.writeEnd();
page.writeEnd();
} else {
page.writeTypeObjectLabel(item);
}
page.writeEnd();
}
page.writeEnd();
}
}