/*
* Copyright (C) 2003-2013 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.forum.create;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.exoplatform.forum.common.CommonUtils;
import org.exoplatform.forum.common.UserHelper;
import org.exoplatform.forum.common.webui.BaseUIForm;
import org.exoplatform.forum.common.webui.UIFormScrollSelectBox;
import org.exoplatform.forum.common.webui.UIForumFilter;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.service.filter.model.CategoryFilter;
import org.exoplatform.forum.service.filter.model.ForumFilter;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.social.core.space.model.Space;
import org.exoplatform.social.core.space.spi.SpaceService;
import org.exoplatform.social.core.space.SpaceUtils;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
public class UICreateForm extends BaseUIForm {
public static final String LOCATION_SELECT_BOX = "location";
public static final String FORUM_SELECT_BOX = "forumId";
private static final String INTRANER = "intranet";
public boolean isStepOne = true;
public boolean hasForumIntranet = true;
public boolean hasForum = true;
public boolean hasNext = true;
public String parStatus = "";
public String categoryIdOfSpaces = "";
public String currentIntranet = INTRANER;
public CategoryFilter onlyOneForum = null;
public List<String> allPortalNames = new ArrayList<String>();
public enum ACTION_TYPE {
CREATE_POLL, CREATE_TOPIC
}
public void setParStatus(String parStatus) {
this.parStatus = parStatus;
}
public String getParStatus() {
return parStatus;
}
public boolean hasForum() {
return hasForum;
}
public boolean hasNext() {
return hasNext;
}
public UICreateForm() throws Exception {
hasNext = true;
isStepOne = true;
currentIntranet = getIntranerSite();
List<SelectItemOption<String>> list = new ArrayList<SelectItemOption<String>>();
allPortalNames = CreateUtils.getAllPortalNames();
String currentUser = UserHelper.getCurrentUser();
ForumService forumService = getApplicationComponent(ForumService.class);
List<CategoryFilter> filters = forumService.filterForumByName("_", currentUser, 2);
int categoriesSize = filters.size();
if(categoriesSize == 1 && filters.get(0).getForumFilters().size() == 1) {
onlyOneForum = filters.get(0);
}
hasForumIntranet = (categoriesSize > 0);
if(hasForumIntranet) {
list.add(new SelectItemOption<String>(currentIntranet, currentIntranet));
}
Category categoryIncludedSpace = forumService.getCategoryIncludedSpace();
if(categoryIncludedSpace != null) {
List<String> groupAndMembershipInfos = UserHelper.getAllGroupAndMembershipOfUser(null);
this.categoryIdOfSpaces = categoryIncludedSpace.getId();
ForumFilter filter = new ForumFilter(categoryIdOfSpaces, true);
filter.userId(currentUser);
List<Forum> forums = forumService.getForums(filter);
SpaceService spaceService = getApplicationComponent(SpaceService.class);
List<Space> spaces = spaceService.getLastAccessedSpace(currentUser, null, 0, forums.size());
Forum forum;
for (Space space : spaces) {
forum = getForum(forums, space.getGroupId(), groupAndMembershipInfos);
if (forum != null) {
list.add(new SelectItemOption<String>(space.getDisplayName(), forum.getId()));
}
}
}
if(list.size() > 0) {
UIFormScrollSelectBox formSelectBox = new UIFormScrollSelectBox(LOCATION_SELECT_BOX, LOCATION_SELECT_BOX, list);
if(hasForumIntranet) {
formSelectBox.setValue(currentIntranet);
}
formSelectBox.setOnChange("OnChangeLocal");
addUIFormInput(formSelectBox);
hasForum = true;
setActions(new String[]{"Next","Cancel"});
} else {
hasForum = false;
setActions(new String[]{"Cancel"});
}
}
private Forum getForum(List<Forum> forums, String spaceGroupId, List<String> listOfCanviewrs) {
String spaceName = spaceGroupId.replaceAll(SpaceUtils.SPACE_GROUP + CommonUtils.SLASH, CommonUtils.EMPTY_STR);
for (Forum forum : forums) {
if(forum.getId().equals(Utils.FORUM_SPACE_ID_PREFIX + spaceName)) {
if(forum.getIsLock() ||
(forum.getCreateTopicRole() != null && Utils.hasPermission(listOfCanviewrs, Arrays.asList(forum.getCreateTopicRole())) == false)) {
return null;
}
return forum;
}
}
return null;
}
public String getIntranerSite() {
String portalName = CreateUtils.getCurrentPortalName();
if (portalName.equalsIgnoreCase(SiteType.GROUP.name())) {
return INTRANER;
}
return portalName;
}
public static void nextAction(UICreateForm uiForm, ACTION_TYPE type, WebuiRequestContext context) throws Exception {
if (uiForm.isStepOne && uiForm.hasForumIntranet) {
uiForm.isStepOne = false;
if(uiForm.onlyOneForum == null){
UIForumFilter forumFilter = uiForm.getUIForumFilter(FORUM_SELECT_BOX);
if (forumFilter == null) {
forumFilter = new UIForumFilter(FORUM_SELECT_BOX, FORUM_SELECT_BOX);
forumFilter.setOnChange("OnChangeFilter");
uiForm.addUIFormInput(forumFilter);
}
forumFilter.setRendered(true);
uiForm.hasNext = false;
context.addUIComponentToUpdateByAjax(uiForm);
} else {
nextAction(uiForm, type, context);
}
} else {
String location = uiForm.getUIFormScrollSelectBox(LOCATION_SELECT_BOX).getValue();
String subUrl = null;
if (uiForm.currentIntranet.equals(location)) {
if (uiForm.onlyOneForum == null) {
UIForumFilter forumFilter = uiForm.getUIForumFilter(FORUM_SELECT_BOX);
String categoryId = forumFilter.getCategoryId();
String forumId = forumFilter.getForumId();
if (!CommonUtils.isEmpty(forumId)) {
subUrl = urlBuilder(categoryId, forumId, type, location);
} else {
uiForm.warning("UICreateList.label.RequireSelectForum");
}
} else {
String categoryId = uiForm.onlyOneForum.getCategoryId();
String forumId = uiForm.onlyOneForum.getForumFilters().get(0).getForumId();
subUrl = urlBuilder(categoryId, forumId, type, location);
uiForm.onlyOneForum = null;
}
} else {
subUrl = urlBuilder(uiForm.categoryIdOfSpaces, location, type, null);
}
if (!CommonUtils.isEmpty(subUrl)) {
uiForm.log.info(uiForm.getId() + "::sendRedirect =" + subUrl);
PortalRequestContext pContext = Util.getPortalRequestContext();
pContext.getJavascriptManager().getRequireJS().addScripts("(function(){ window.location.href = '" + subUrl + "';})();");
uiForm.isStepOne = true;
if (uiForm.getChildById(FORUM_SELECT_BOX) != null) {
uiForm.removeChildById(FORUM_SELECT_BOX);
}
context.addUIComponentToUpdateByAjax(uiForm);
UIContainer container = uiForm.getParent();
List<UIComponent> uilist = container.getChildren();
List<String> lisID = new ArrayList<String>();
if (uilist.size() != 0) {
for (UIComponent uIComponent : uilist) {
lisID.add(uIComponent.getId());
}
for (String id : lisID) {
container.removeChildById(id);
}
}
context.addUIComponentToUpdateByAjax(container);
}
}
}
private static String urlBuilder(String categoryId, String forumId, ACTION_TYPE type, String siteName) {
String urlBuilder = CreateUtils.buildLink(categoryId, forumId, null, siteName);
if (!CommonUtils.isEmpty(urlBuilder)) {
String actionType = (type.equals(ACTION_TYPE.CREATE_TOPIC)) ? "?hasCreateTopic=true" : "?hasCreatePoll=true";
urlBuilder += actionType;
}
return urlBuilder;
}
static public class OnChangeFilterActionListener extends EventListener<UICreateForm> {
public void execute(Event<UICreateForm> event) throws Exception {
UICreateForm createForm = event.getSource();
createForm.isStepOne = false;
createForm.hasNext = true;
event.getRequestContext().addUIComponentToUpdateByAjax(createForm);
}
}
static public class CancelActionListener extends EventListener<UICreateForm> {
public void execute(Event<UICreateForm> event) throws Exception {
UICreateForm createForm = event.getSource();
createForm.isStepOne = true;
if (createForm.getChildById(FORUM_SELECT_BOX) != null) {
createForm.removeChildById(FORUM_SELECT_BOX);
}
WebuiRequestContext ctx = event.getRequestContext();
Event<UIComponent> cancelEvent = createForm.getParent().createEvent("Cancel", Event.Phase.DECODE, ctx);
if (cancelEvent != null) {
cancelEvent.broadcast();
}
}
}
}