/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.platform.component;
import org.exoplatform.platform.webui.NavigationURLUtils;
import org.exoplatform.platform.webui.navigation.TreeNode;
import org.exoplatform.platform.webui.navigation.UINavigationManagement;
import org.exoplatform.platform.webui.navigation.UINavigationNodeSelector;
import org.exoplatform.platform.webui.navigation.UIPageNodeForm;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.config.UserACL;
import org.exoplatform.portal.config.UserPortalConfig;
import org.exoplatform.portal.config.UserPortalConfigService;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.webui.page.UIPage;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.social.core.space.model.Space;
import org.exoplatform.social.core.space.spi.SpaceService;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.seo.UISEOToolbarForm;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiApplication;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPortletApplication;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import java.util.List;
//import org.exoplatform.webos.webui.page.UIDesktopPage;
@ComponentConfigs({
@ComponentConfig(template = "app:/groovy/platformNavigation/portlet/UIAdminToolbarPortlet/UIAdminToolbarContainer.gtmpl", events = {
@EventConfig(listeners = UIAdminToolbarContainer.ChangeEditingActionListener.class),
@EventConfig(listeners = UIAdminToolbarContainer.EditNavigationActionListener.class) }),
@ComponentConfig(type = UIPageNodeForm.class, lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormTabPane.gtmpl", events = {
@EventConfig(listeners = UIPageNodeForm.SaveActionListener.class),
@EventConfig(listeners = UIAdminToolbarContainer.BackActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.SwitchPublicationDateActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.SwitchLabelModeActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.ChangeLanguageActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.SwitchVisibleActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.ClearPageActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPageNodeForm.CreatePageActionListener.class, phase = Phase.DECODE) }) })
public class UIAdminToolbarContainer extends UIPortletApplication {
private static final String SEO_TOOLBAR_FORM_POPUP_CONTAINER_ID = "UISEOToolbarFormPopupContainer";
private static final String EDIT_NAVIGATION_POPUP_CONTAINER_ID = "UIPopupWindow-UIEditNavigationPopupContainer";
private static final String PAGE_MANAGEMENT_URI = "administration/pageManagement";
private String pageManagementLink = null;
private SpaceService spaceService = null;
private String userId = null;
protected UINavigationManagement naviManager;
public UIAdminToolbarContainer() throws Exception {
PortalRequestContext context = Util.getPortalRequestContext();
Boolean quickEdit = (Boolean) context.getRequest().getSession().getAttribute(Utils.TURN_ON_QUICK_EDIT);
if (quickEdit == null) {
context.getRequest().getSession().setAttribute(Utils.TURN_ON_QUICK_EDIT, false);
}
addChild(UIPopupContainer.class, null, SEO_TOOLBAR_FORM_POPUP_CONTAINER_ID);
addChild(UISEOToolbarForm.class, null, null);
spaceService = getApplicationComponent(SpaceService.class);
}
public String getPageManagementLink() {
if (pageManagementLink == null) {
UserACL userACL = getApplicationComponent(UserACL.class);
String[] adminGroups = userACL.getAdminGroups().split(";");
pageManagementLink = NavigationURLUtils.getURL(SiteKey.group(adminGroups[0]), PAGE_MANAGEMENT_URI);
}
return pageManagementLink;
}
public boolean hasEditPermissionOnPortal() throws Exception {
return Utils.hasEditPermissionOnPortal();
}
public boolean isGroupNavigation() throws Exception {
return SiteType.GROUP.equals(Utils.getSelectedNavigation().getKey().getType());
}
public boolean isPortaNavigation() throws Exception {
return SiteType.PORTAL.equals(Utils.getSelectedNavigation().getKey().getType());
}
public boolean isUserNavigation() throws Exception {
return SiteType.USER.equals(Utils.getSelectedNavigation().getKey().getType());
}
public boolean hasEditPermissionOnNavigation() throws Exception {
return Utils.hasEditPermissionOnNavigation();
}
public boolean hasEditPermissionOnPage() throws Exception {
return Utils.hasEditPermissionOnPage();
}
public boolean isSpaceManager() throws Exception {
if (spaceService != null) {
UserNavigation currentUserNavigation = Util.getUIPortal().getSelectedUserNode().getNavigation();
if (SiteType.GROUP.equals((currentUserNavigation.getKey().getType()))
&& currentUserNavigation.getKey().getName().contains("/spaces")) {
String remoteUser = getUserId();
String spaceId = currentUserNavigation.getKey().getName();
Space space = spaceService.getSpaceByGroupId(spaceId);
return (space != null && spaceService.hasSettingPermission(space, remoteUser));
}
}
return true;
}
public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception {
// A user could view the toolbar portlet if he has edit permission
// either on 'active' page, 'active' portal or 'active' navigation
boolean canAccessMenu = canAcceedMenu();
if (canAccessMenu) {
super.processRender(app, context);
}
}
@Override
public void processRender(WebuiRequestContext context) throws Exception {
boolean canAccessMenu = canAcceedMenu();
if (canAccessMenu) {
super.processRender(context);
}
}
public static UserPortal getUserPortal() {
UserPortalConfig portalConfig = Util.getPortalRequestContext().getUserPortalConfig();
return portalConfig.getUserPortal();
}
@Override
public void renderChildren() throws Exception {
List<UIComponent> list = getChildren();
for (UIComponent child : list) {
if (!(child instanceof UISEOToolbarForm) && child.isRendered()) {
renderChild(child);
}
}
}
public String getUserId() {
if (userId == null) {
userId = Util.getPortalRequestContext().getRemoteUser();
}
return userId;
}
public String getUIPageId() {
UIPortalApplication portalApp = Util.getUIPortalApplication();
UIPage uiPage = portalApp.findFirstComponentOfType(UIPage.class);
return uiPage.getId();
}
private boolean canAcceedMenu() throws Exception {
UIPortalApplication portalApp = Util.getUIPortalApplication();
UIPage uiPage = portalApp.findFirstComponentOfType(UIPage.class);
// boolean canAccessMenu = (!(uiPage instanceof UIDesktopPage))
// && (hasEditPermissionOnNavigation() || hasEditPermissionOnPage() || hasEditPermissionOnPortal());
boolean canAccessMenu = (hasEditPermissionOnNavigation() || hasEditPermissionOnPage() || hasEditPermissionOnPortal());
return canAccessMenu;
}
public static class ChangeEditingActionListener extends EventListener<UIAdminToolbarContainer> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform
* .webui.event.Event)
*/
public void execute(Event<UIAdminToolbarContainer> event) throws Exception {
PortalRequestContext context = Util.getPortalRequestContext();
Boolean quickEdit = (Boolean) context.getRequest().getSession().getAttribute(Utils.TURN_ON_QUICK_EDIT);
if (quickEdit == null || !quickEdit) {
context.getRequest().getSession().setAttribute(Utils.TURN_ON_QUICK_EDIT, true);
//Utils.updatePortal((PortletRequestContext) event.getRequestContext());
} else {
context.getRequest().getSession().setAttribute(Utils.TURN_ON_QUICK_EDIT, false);
//Utils.updatePortal((PortletRequestContext) event.getRequestContext());
}
event.getRequestContext().getJavascriptManager().getRequireJS().addScripts("location.reload(true);");
}
}
static public class EditNavigationActionListener extends EventListener<UIAdminToolbarContainer> {
public void execute(Event<UIAdminToolbarContainer> event) throws Exception {
UIAdminToolbarContainer uicomp = event.getSource();
UserNavigation edittedNavigation = Utils.getSelectedNavigation();
WebuiRequestContext context = event.getRequestContext();
UIApplication uiApplication = context.getUIApplication();
if (edittedNavigation == null) {
uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.Invalid-editPermission", null));
return;
}
UserACL userACL = uicomp.getApplicationComponent(UserACL.class);
if (edittedNavigation.getKey().getType().equals(SiteType.PORTAL)) {
String portalName = Util.getPortalRequestContext().getPortalOwner();
UserPortalConfigService configService = uicomp.getApplicationComponent(UserPortalConfigService.class);
UserPortalConfig userPortalConfig = configService.getUserPortalConfig(portalName, context.getRemoteUser(),
PortalRequestContext.USER_PORTAL_CONTEXT);
if (userPortalConfig == null) {
uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.portal-not-exist", new String[] { portalName }));
return;
}
if (!userACL.hasEditPermission(userPortalConfig.getPortalConfig())) {
uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.Invalid-editPermission", null));
return;
}
} else if (edittedNavigation.getKey().getType().equals(PortalConfig.GROUP_TYPE)) {
if (!userACL.hasEditPermissionOnNavigation(SiteKey.group(edittedNavigation.getKey().getTypeName()))) {
uiApplication.addMessage(new ApplicationMessage("UISiteManagement.msg.Invalid-editPermission", null));
return;
}
}
if (uicomp.naviManager == null) {
uicomp.naviManager = uicomp.createUIComponent(UINavigationManagement.class, null, null);
}
Utils.createPopupWindow(uicomp, uicomp.naviManager, EDIT_NAVIGATION_POPUP_CONTAINER_ID, 400, -1, -1);
uicomp.naviManager.setSiteKey(edittedNavigation.getKey());
UserPortal userPortal = getUserPortal();
UINavigationNodeSelector selector = uicomp.naviManager.getChild(UINavigationNodeSelector.class);
selector.setEdittedNavigation(edittedNavigation);
selector.setUserPortal(userPortal);
selector.initTreeData();
context.addUIComponentToUpdateByAjax(uicomp);
}
}
static public class BackActionListener extends EventListener<UIPageNodeForm> {
public void execute(Event<UIPageNodeForm> event) throws Exception {
UIPageNodeForm uiPageNodeForm = event.getSource();
UIAdminToolbarContainer uicomp = uiPageNodeForm.getAncestorOfType(UIAdminToolbarContainer.class);
UINavigationNodeSelector selector = uicomp.naviManager.getChild(UINavigationNodeSelector.class);
TreeNode selectedParent = (TreeNode) uiPageNodeForm.getSelectedParent();
selector.selectNode(selectedParent);
WebuiRequestContext context = event.getRequestContext();
Utils.createPopupWindow(uicomp, uicomp.naviManager, EDIT_NAVIGATION_POPUP_CONTAINER_ID, 400, -1, -1);
context.addUIComponentToUpdateByAjax(uicomp);
TreeNode pageNode = uiPageNodeForm.getPageNode();
if (pageNode != null) {
selector.getUserNodeLabels().put(pageNode.getId(), pageNode.getI18nizedLabels());
}
selector.createEvent("NodeModified", Phase.PROCESS, context).broadcast();
}
}
}