/* * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.wcm.webui.category.config; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.portlet.PortletMode; import javax.portlet.PortletPreferences; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.webui.portal.UIPortal; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.cms.taxonomy.TaxonomyService; import org.exoplatform.services.cms.views.ApplicationTemplateManagerService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.config.RepositoryEntry; import org.exoplatform.services.wcm.portal.LivePortalManagerService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.wcm.webui.Utils; import org.exoplatform.wcm.webui.category.UICategoryNavigationConstant; import org.exoplatform.wcm.webui.category.UICategoryNavigationPortlet; import org.exoplatform.wcm.webui.category.UICategoryNavigationUtils; import org.exoplatform.wcm.webui.selector.page.UIPageSelector; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequireJS; import org.exoplatform.web.url.navigation.NodeURL; import org.exoplatform.webui.application.portlet.PortletRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIPopupContainer; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.ext.UIFormInputSetWithAction; /** * Created by The eXo Platform SAS * Author : eXoPlatform * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Jun 28, 2009 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UICategoryNavigationConfig.SaveActionListener.class), @EventConfig(listeners = UICategoryNavigationConfig.CancelActionListener.class), @EventConfig(listeners = UICategoryNavigationConfig.ChangeRepositoryActionListener.class), @EventConfig(listeners = UICategoryNavigationConfig.SelectTargetPathActionListener.class) } ) public class UICategoryNavigationConfig extends UIForm implements UISelectable { /** The popup id. */ private String popupId; /** * Instantiates a new uI category navigation config. * * @throws Exception the exception */ public UICategoryNavigationConfig() throws Exception { PortletPreferences preferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceRepository = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_REPOSITORY, ""); RepositoryService repositoryService = getApplicationComponent(RepositoryService.class) ; List<SelectItemOption<String>> repositories = new ArrayList<SelectItemOption<String>>() ; RepositoryEntry repositoryEntry = repositoryService.getCurrentRepository().getConfiguration(); repositories.add(new SelectItemOption<String>(repositoryEntry.getName())) ; UIFormSelectBox repositoryFormSelectBox = new UIFormSelectBox(UICategoryNavigationConstant.REPOSITORY_FORM_SELECTBOX, UICategoryNavigationConstant.REPOSITORY_FORM_SELECTBOX, repositories); repositoryFormSelectBox.setValue(preferenceRepository); repositoryFormSelectBox.setOnChange("ChangeRepository"); addUIFormInput(repositoryFormSelectBox); String preferenceTreeTitle = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_TITLE, ""); addUIFormInput(new UIFormStringInput(UICategoryNavigationConstant.TREE_TITLE_FORM_STRING_INPUT, UICategoryNavigationConstant.TREE_TITLE_FORM_STRING_INPUT, preferenceTreeTitle)); String preferenceTreeName = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, ""); List<SelectItemOption<String>> trees = getTaxonomyTrees(); UIFormSelectBox treeNameFormSelectBox = new UIFormSelectBox(UICategoryNavigationConstant.TREE_NAME_FORM_SELECTBOX, UICategoryNavigationConstant.TREE_NAME_FORM_SELECTBOX, trees); treeNameFormSelectBox.setValue(preferenceTreeName); addUIFormInput(treeNameFormSelectBox); String preferencePortletName = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_PORTLET_NAME, ""); String preferenceTemplateCategory = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_TEMPLATE_CATEGORY, ""); String preferenceTemplatePath = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_TEMPLATE_PATH, ""); List<SelectItemOption<String>> templates = getTemplateList(preferencePortletName, preferenceTemplateCategory); UIFormSelectBox templateFormSelectBox = new UIFormSelectBox(UICategoryNavigationConstant.TEMPLATE_FORM_SELECTBOX, UICategoryNavigationConstant.TEMPLATE_FORM_SELECTBOX, templates); templateFormSelectBox.setValue(preferenceTemplatePath); addUIFormInput(templateFormSelectBox); String preferenceTargetPath = preferences.getValue(UICategoryNavigationConstant.PREFERENCE_TARGET_PAGE, ""); UIFormInputSetWithAction targetPathFormInputSet = new UIFormInputSetWithAction(UICategoryNavigationConstant.TARGET_PATH_FORM_INPUT_SET); UIFormStringInput targetPathFormStringInput = new UIFormStringInput(UICategoryNavigationConstant.TARGET_PATH_FORM_STRING_INPUT, UICategoryNavigationConstant.TARGET_PATH_FORM_STRING_INPUT, preferenceTargetPath); targetPathFormStringInput.setReadOnly(true); targetPathFormInputSet.setActionInfo(UICategoryNavigationConstant.TARGET_PATH_FORM_STRING_INPUT, new String[] { "SelectTargetPath" }); targetPathFormInputSet.addUIFormInput(targetPathFormStringInput); addChild(targetPathFormInputSet); setActions(new String[] {"Save", "Cancel"}); } /** * Gets the popup id. * * @return the popup id */ public String getPopupId() { return popupId; } /** * Sets the popup id. * * @param popupId the new popup id */ public void setPopupId(String popupId) { this.popupId = popupId; } /** * Gets the template list. * * @param portletName the portlet name * @param templateCategory the template category * * @return the template list * * @throws Exception the exception */ private List<SelectItemOption<String>> getTemplateList(String portletName, String templateCategory) throws Exception { List<SelectItemOption<String>> templates = new ArrayList<SelectItemOption<String>>(); ApplicationTemplateManagerService appTemplateMngService = getApplicationComponent(ApplicationTemplateManagerService.class); List<Node> templateNodes = appTemplateMngService.getTemplatesByCategory(portletName, templateCategory, WCMCoreUtils.getUserSessionProvider()); for (Node templateNode : templateNodes) { String templateName = templateNode.getName(); String templatePath = templateNode.getPath(); templates.add(new SelectItemOption<String>(templateName, templatePath)); } return templates; } /** * Gets the taxonomy trees. * * @param repository the repository * * @return the taxonomy trees * * @throws Exception the exception */ private List<SelectItemOption<String>> getTaxonomyTrees() throws Exception { TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class); LivePortalManagerService livePortalManagerService = getApplicationComponent(LivePortalManagerService.class); List<Node> taxonomyNodes = taxonomyService.getAllTaxonomyTrees(); List<SelectItemOption<String>> taxonomyTrees = new ArrayList<SelectItemOption<String>>(); for(Node taxonomyNode : taxonomyNodes) { Node portalNode = livePortalManagerService.getLivePortalByChild(taxonomyNode); if (portalNode != null) taxonomyTrees.add(new SelectItemOption<String>(taxonomyNode.getName(), taxonomyNode.getName())); } return taxonomyTrees; } /* (non-Javadoc) * @see org.exoplatform.ecm.webui.selector.UISelectable#doSelect(java.lang.String, java.lang.Object) */ public void doSelect(String selectField, Object value) throws Exception { UIFormStringInput formStringInput = findComponentById(selectField); formStringInput.setValue(value.toString()) ; UICategoryNavigationPortlet categoryNavigationPortlet = getAncestorOfType(UICategoryNavigationPortlet.class); UIPopupContainer popupContainer = categoryNavigationPortlet.getChild(UIPopupContainer.class); Utils.closePopupWindow(popupContainer, popupId); } /** * The listener interface for receiving saveAction events. * The class that is interested in processing a saveAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSaveActionListener</code> method. When * the saveAction event occurs, that object's appropriate * method is invoked. */ public static class SaveActionListener extends EventListener<UICategoryNavigationConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UICategoryNavigationConfig> event) throws Exception { UICategoryNavigationConfig categoryNavigationConfig = event.getSource(); String preferenceRepository = categoryNavigationConfig. getUIFormSelectBox(UICategoryNavigationConstant.REPOSITORY_FORM_SELECTBOX).getValue(); String preferenceTreeName = categoryNavigationConfig. getUIFormSelectBox(UICategoryNavigationConstant.TREE_NAME_FORM_SELECTBOX).getValue(); String preferenceTreeTitle = categoryNavigationConfig. getUIStringInput(UICategoryNavigationConstant.TREE_TITLE_FORM_STRING_INPUT).getValue(); if (preferenceTreeTitle == null) preferenceTreeTitle = ""; String preferenceTargetPath = categoryNavigationConfig. getUIStringInput(UICategoryNavigationConstant.TARGET_PATH_FORM_STRING_INPUT).getValue(); String preferenceTemplate = categoryNavigationConfig. getUIFormSelectBox(UICategoryNavigationConstant.TEMPLATE_FORM_SELECTBOX).getValue(); PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); portletPreferences.setValue(UICategoryNavigationConstant.PREFERENCE_REPOSITORY, preferenceRepository); portletPreferences.setValue(UICategoryNavigationConstant.PREFERENCE_TREE_NAME, preferenceTreeName); portletPreferences.setValue(UICategoryNavigationConstant.PREFERENCE_TREE_TITLE, preferenceTreeTitle); portletPreferences.setValue(UICategoryNavigationConstant.PREFERENCE_TARGET_PAGE, preferenceTargetPath); portletPreferences.setValue(UICategoryNavigationConstant.PREFERENCE_TEMPLATE_PATH, preferenceTemplate); portletPreferences.store(); if (!Utils.isEditPortletInCreatePageWizard()) { PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); UIPortal uiPortal = Util.getUIPortal(); NodeURL nodeURL = portalRequestContext.createURL(NodeURL.TYPE); String uri = nodeURL.setNode(uiPortal.getSelectedUserNode()).toString(); ((PortletRequestContext)event.getRequestContext()).setApplicationMode(PortletMode.VIEW); Utils.closePopupWindow(categoryNavigationConfig, UICategoryNavigationPortlet.CONFIG_POPUP_WINDOW); RequireJS requireJS = event.getRequestContext().getJavascriptManager().getRequireJS(); requireJS.require("SHARED/ecm-utils", "ecmutil").addScripts("ecmutil.ECMUtils.ajaxRedirect('" + uri + "');"); } else { if (Utils.isQuickEditMode(categoryNavigationConfig, UICategoryNavigationPortlet.CONFIG_POPUP_WINDOW)) { Utils.closePopupWindow(categoryNavigationConfig, UICategoryNavigationPortlet.CONFIG_POPUP_WINDOW); } else { Utils.createPopupMessage(categoryNavigationConfig, "UICategoryNavigationConfig.msg.saving-success", null, ApplicationMessage.INFO); } } } } /** * The listener interface for receiving cancelAction events. * The class that is interested in processing a cancelAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addCancelActionListener</code> method. When * the cancelAction event occurs, that object's appropriate * method is invoked. */ public static class CancelActionListener extends EventListener<UICategoryNavigationConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UICategoryNavigationConfig> event) throws Exception { UICategoryNavigationConfig viewerManagementForm = event.getSource(); Utils.closePopupWindow(viewerManagementForm, UICategoryNavigationPortlet.CONFIG_POPUP_WINDOW); ((PortletRequestContext)event.getRequestContext()).setApplicationMode(PortletMode.VIEW); } } /** * The listener interface for receiving changeRepositoryAction events. * The class that is interested in processing a changeRepositoryAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addChangeRepositoryActionListener</code> method. When * the changeRepositoryAction event occurs, that object's appropriate * method is invoked. */ public static class ChangeRepositoryActionListener extends EventListener<UICategoryNavigationConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UICategoryNavigationConfig> event) throws Exception { } } /** * The listener interface for receiving selectTargetPathAction events. * The class that is interested in processing a selectTargetPathAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSelectTargetPathActionListener</code> method. When * the selectTargetPathAction event occurs, that object's appropriate * method is invoked. */ public static class SelectTargetPathActionListener extends EventListener<UICategoryNavigationConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UICategoryNavigationConfig> event) throws Exception { UICategoryNavigationConfig categoryNavigationConfig = event.getSource(); UICategoryNavigationPortlet categoryNavigationPortlet = categoryNavigationConfig. getAncestorOfType(UICategoryNavigationPortlet.class); UIPopupContainer popupContainer = categoryNavigationPortlet.getChild(UIPopupContainer.class); UIPageSelector pageSelector = popupContainer.createUIComponent(UIPageSelector.class, null, null); pageSelector.setSourceComponent(categoryNavigationConfig, new String[] { UICategoryNavigationConstant.TARGET_PATH_FORM_STRING_INPUT }); Utils.createPopupWindow(popupContainer, pageSelector, UICategoryNavigationConstant.TARGET_PATH_SELECTOR_POPUP_WINDOW, 700); categoryNavigationConfig.setPopupId(UICategoryNavigationConstant.TARGET_PATH_SELECTOR_POPUP_WINDOW); } } }