package com.psddev.cms.tool.content; import com.psddev.cms.db.Global; import com.psddev.cms.db.Localization; import com.psddev.cms.db.Site; import com.psddev.cms.tool.ContentEditWidgetPlacement; import com.psddev.cms.tool.ToolPageContext; import com.psddev.cms.tool.UpdatingContentEditWidget; import com.psddev.dari.db.Query; import com.psddev.dari.db.State; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.UUID; public class SitesWidget extends UpdatingContentEditWidget { @Override public boolean shouldDisplay(ToolPageContext page, Object content) { return true; } @Override public ContentEditWidgetPlacement getPlacement(ToolPageContext page, Object content) { return ContentEditWidgetPlacement.RIGHT; } @Override public double getPosition(ToolPageContext page, Object content, ContentEditWidgetPlacement placement) { return -20.0; } @Override public String getHeading(ToolPageContext page, Object content) { return Localization.currentUserText(getClass(), "title"); } @Override public void displayOrUpdate(ToolPageContext page, Object content, ContentEditWidgetPlacement placement) throws IOException { List<Site> allSites = Site.Static.findAll(); if (allSites.isEmpty()) { return; } Object original = page.getRequest().getAttribute("original"); if (original == null) { original = content; } if (original instanceof Global) { return; } State state = State.getInstance(original); Site.ObjectModification siteData = state.as(Site.ObjectModification.class); String namePrefix = state.getId() + "/sites/"; String ownerName = namePrefix + "owner"; String accessName = namePrefix + "access"; String consumerIdName = namePrefix + "consumerId"; Site owner = siteData.getOwner(); Set<Site> consumers = siteData.getConsumers(); if (placement == null) { if (owner == null || page.hasPermission(owner.getPermissionId())) { owner = Query.from(Site.class).where("_id = ?", page.param(UUID.class, ownerName)).first(); siteData.setOwner(owner); } String access = page.param(String.class, accessName); consumers.clear(); if ("no".equals(access)) { siteData.setGlobal(false); siteData.setBlacklist(null); siteData.setConsumers(null); } else if ("all".equals(access)) { siteData.setGlobal(true); siteData.setBlacklist(null); siteData.setConsumers(null); } else if ("some".equals(access)) { siteData.setGlobal(false); List<UUID> consumerIds = page.params(UUID.class, consumerIdName); for (Site site : allSites) { if (consumerIds.contains(site.getId())) { consumers.add(site); } } } return; } String sitesContainerId = page.createId(); String access = siteData.isGlobal() ? "all" : (consumers.isEmpty() ? "no" : "some"); page.writeStart("div", "class", "ContentEditSites-owner"); { page.writeStart("label", "for", page.createId()); page.writeHtml(page.localize(getClass(), "label.owner")); page.writeEnd(); if (owner != null && !page.hasPermission(owner.getPermissionId())) { page.writeStart("div"); page.getObjectLabel(owner); page.writeEnd(); } else { page.writeStart("select", "class", "toggleable", "data-root", ".widget", "name", ownerName, "style", "width: 100%;"); { page.writeStart("option", "selected", owner == null ? "selected" : null, "value", "", "data-show", ".siteItem"); page.writeHtml("None"); page.writeEnd(); for (Site site : allSites) { if (page.hasPermission(site.getPermissionId())) { page.writeStart("option", "selected", site.equals(owner) ? "selected" : null, "value", site.getId(), "data-show", ".siteItem:not(.siteItem-" + site.getId() + ")", "data-hide", ".siteItem-" + site.getId()); page.writeObjectLabel(site); page.writeEnd(); } } } page.writeEnd(); } } page.writeEnd(); page.writeStart("div", "class", "ContentEditSites-access"); { page.writeStart("label", "for", page.createId()); page.writeHtml(page.localize(getClass(), "label.access")); page.writeEnd(); page.writeStart("select", "class", "toggleable", "id", page.getId(), "name", accessName, "style", "width: 100%;"); { page.writeStart("option", "selected", "no".equals(access) ? "selected" : null, "data-hide", "#" + sitesContainerId, "value", "no"); page.writeHtml(page.localize(getClass(), "option.none")); page.writeEnd(); page.writeStart("option", "selected", "all".equals(access) ? "selected" : null, "data-hide", "#" + sitesContainerId, "value", "all"); page.writeHtml(page.localize(getClass(), "option.all")); page.writeEnd(); page.writeStart("option", "selected", "some".equals(access) ? "selected" : null, "data-show", "#" + sitesContainerId, "value", "some"); page.writeHtml(page.localize(getClass(), "option.some")); page.writeEnd(); } page.writeEnd(); page.writeStart("ul", "id", sitesContainerId); { for (Site site : allSites) { if (page.hasPermission(site.getPermissionId())) { page.writeStart("li", "class", "siteItem siteItem-" + site.getId()); { page.writeElement("input", "checked", consumers.contains(site) ? "checked" : null, "id", page.createId(), "name", consumerIdName, "type", "checkbox", "value", site.getId()); page.writeStart("label", "for", page.getId()); page.writeObjectLabel(site); page.writeEnd(); } page.writeEnd(); } else if (consumers.contains(site)) { page.writeElement("input", "name", consumerIdName, "type", "hidden", "value", site.getId()); } } } page.writeEnd(); } page.writeEnd(); } }