package com.psddev.cms.tool.page;
import com.psddev.cms.db.Site;
import com.psddev.cms.db.SiteCategory;
import com.psddev.cms.db.ToolUser;
import com.psddev.cms.tool.PageServlet;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.db.Query;
import com.psddev.dari.util.ObjectUtils;
import com.psddev.dari.util.RoutingFilter;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
@RoutingFilter.Path(application = "cms", value = "/siteSwitch")
public class SiteSwitch extends PageServlet {
private static final String SITE_CATEGORY_INPUT_NAME = "siteCategory";
@Override
protected String getPermissionId() {
return null;
}
@Override
protected void doService(ToolPageContext page) throws IOException, ServletException {
ToolUser user = page.getUser();
if (page.param(boolean.class, "switch")) {
user.setCurrentSite(Query.from(Site.class).where("_id = ?", page.param(UUID.class, "id")).first());
user.save();
String returnUrl = page.param(String.class, "returnUrl");
if (ObjectUtils.isBlank(returnUrl)) {
returnUrl = page.cmsUrl("/");
}
page.getResponse().sendRedirect(returnUrl);
return;
}
page.writeHeader();
if (Query.from(Site.class).hasMoreThan(0)) {
Site currentSite = user.getCurrentSite();
List<Site> sites = user.findOtherAccessibleSites();
// Only render the control if there is at least one Site to which the ToolUser can change
// Case 1: ToolUser has access to at least one other Site (not including Global)
// Case 2: ToolUser has access to at least one Site and the Global Site
if (!sites.isEmpty() || (currentSite != null && page.hasPermission("site/global"))) {
page.writeStart("div", "class", "widget");
page.writeStart("h1");
page.writeHtml(page.localize(SiteSwitch.class, "title"));
page.writeEnd();
page.writeStart("div", "class", "siteSwitch-content fixedScrollable");
page.writeStart("form",
"action", page.cmsUrl("/siteSwitchResults"),
"method", "get",
"data-bsp-autosubmit", "",
"target", "siteSwitchResults");
page.writeElement("input",
"type", "hidden",
"name", "returnUrl",
"value", page.param(String.class, "returnUrl"));
if (Query.from(SiteCategory.class).hasMoreThan(0)) {
page.writeStart("select",
"data-searchable", true,
"name", SITE_CATEGORY_INPUT_NAME,
"style", "display: block;");
page.writeStart("option", "value", "");
page.writeHtml(page.localize(SiteSwitch.class, "label.noCategory"));
page.writeEnd();
for (SiteCategory siteCategory : Query.from(SiteCategory.class).selectAll()) {
page.writeStart("option", "value", siteCategory.getId());
page.writeHtml(siteCategory.getLabel());
page.writeEnd();
}
page.writeEnd();
}
page.writeStart("div", "class", "searchInput");
page.writeStart("label", "for", page.createId());
page.write(page.localize(SiteSwitch.class, "label.search"));
page.writeEnd();
page.writeTag("input", "id", page.getId(),
"class", "autoFocus",
"name", "query",
"type", "text",
"value", "");
page.writeEnd();
page.writeEnd();
page.writeStart("div", "class", "frame", "name", "siteSwitchResults");
page.writeEnd();
page.writeEnd();
}
}
page.writeFooter();
}
}