/***************************************************************************
* Copyright (C) 2003-2007 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.faq.webui.popup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.exoplatform.faq.service.Category;
import org.exoplatform.faq.webui.BaseUIFAQForm;
import org.exoplatform.faq.webui.FAQUtils;
import org.exoplatform.faq.webui.UIAnswersPortlet;
import org.exoplatform.faq.webui.UICategories;
import org.exoplatform.faq.webui.UIQuestions;
import org.exoplatform.ks.common.UserHelper;
import org.exoplatform.ks.common.Utils;
import org.exoplatform.ks.common.webui.BaseEventListener;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.ks.common.webui.UISelectComponent;
import org.exoplatform.ks.common.webui.UISelector;
import org.exoplatform.ks.common.webui.UIUserSelect;
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.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.UITree;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
import org.exoplatform.webui.form.UIFormInputWithActions;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.UIFormInputWithActions.ActionData;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.webui.organization.account.UIUserSelector;
/**
* Created by The eXo Platform SARL
* Author : Hung Nguyen
* hung.nguyen@exoplatform.com
* Aus 01, 2007 2:48:18 PM
*/
@ComponentConfigs(
{
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(listeners = UICategoryForm.SaveActionListener.class),
@EventConfig(listeners = UICategoryForm.SelectPermissionActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UICategoryForm.CancelActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UICategoryForm.AddValuesUserActionListener.class, phase = Phase.DECODE)
}
),
@ComponentConfig(id = "UICategoryUserPopupWindow", type = UIPopupWindow.class,
template = "system:/groovy/webui/core/UIPopupWindow.gtmpl",
events = {
@EventConfig(listeners = UICategoryForm.ClosePopupActionListener.class, name = "ClosePopup"),
@EventConfig(listeners = UICategoryForm.AddActionListener.class, name = "Add", phase = Phase.DECODE),
@EventConfig(listeners = UICategoryForm.CloseActionListener.class, name = "Close", phase = Phase.DECODE)
}
)
}
)
public class UICategoryForm extends BaseUIFAQForm implements UIPopupComponent, UISelector {
private String categoryId_ = "";
private String parentId_;
// protected long index_ = 0;
final private static String CATEGORY_DETAIL_TAB = "UIAddCategoryForm";
final private static String FIELD_NAME_INPUT = "eventCategoryName";
final private static String FIELD_DESCRIPTION_INPUT = "description";
final private static String FIELD_USERPRIVATE_INPUT = "userPrivate";
final private static String FIELD_MODERATOR_INPUT = "moderator";
final private static String FIELD_INDEX_INPUT = "index";
final private static String FIELD_MODERATEQUESTIONS_CHECKBOX = "moderatequestions";
public static final String VIEW_AUTHOR_INFOR = "ViewAuthorInfor".intern();
final private static String FIELD_MODERATE_ANSWERS_CHECKBOX = "moderateAnswers";
final private static String USER_SELECTOR_POPUPWINDOW = "UICategoryUserPopupWindow";
private boolean isAddNew_ = true;
private String oldName_ = "";
private Category currentCategory_;
private long maxIndex = 1;
public UICategoryForm() throws Exception {
setActions(new String[] { "Save", "Cancel" });
}
public void updateAddNew(boolean isAddNew) throws Exception {
isAddNew_ = isAddNew;
UIFormInputWithActions inputset = new UIFormInputWithActions(CATEGORY_DETAIL_TAB);
inputset.addUIFormInput(new UIFormStringInput(FIELD_NAME_INPUT, FIELD_NAME_INPUT, null).addValidator(MandatoryValidator.class));
UIFormStringInput index = new UIFormStringInput(FIELD_INDEX_INPUT, FIELD_INDEX_INPUT, null);
maxIndex = getFAQService().getMaxindexCategory(parentId_) + 1;
if (isAddNew)
index.setValue(String.valueOf(maxIndex));
inputset.addUIFormInput(index);
inputset.addUIFormInput(new UIFormTextAreaInput(FIELD_USERPRIVATE_INPUT, FIELD_USERPRIVATE_INPUT, null));
inputset.addUIFormInput(new UIFormTextAreaInput(FIELD_DESCRIPTION_INPUT, FIELD_DESCRIPTION_INPUT, null));
inputset.addUIFormInput(new UIFormCheckBoxInput<Boolean>(FIELD_MODERATEQUESTIONS_CHECKBOX, FIELD_MODERATEQUESTIONS_CHECKBOX, false));
inputset.addUIFormInput(new UIFormCheckBoxInput<Boolean>(VIEW_AUTHOR_INFOR, VIEW_AUTHOR_INFOR, false));
inputset.addUIFormInput(new UIFormCheckBoxInput<Boolean>(FIELD_MODERATE_ANSWERS_CHECKBOX, FIELD_MODERATE_ANSWERS_CHECKBOX, false));
UIFormTextAreaInput moderator = new UIFormTextAreaInput(FIELD_MODERATOR_INPUT, FIELD_MODERATOR_INPUT, null);
if (isAddNew)
moderator.setValue(FAQUtils.getCurrentUser());
moderator.addValidator(MandatoryValidator.class);
inputset.addUIFormInput(moderator);
List<ActionData> actionData;
String[] strings = new String[] { "SelectUser", "SelectMemberShip", "SelectGroup" };
ActionData ad;
String files[] = new String[] { FIELD_USERPRIVATE_INPUT, FIELD_MODERATOR_INPUT };
for (int i = 0; i < files.length; i++) {
int j = 0;
actionData = new ArrayList<ActionData>();
for (String string : strings) {
ad = new ActionData();
ad.setActionName(string);
if (j == 0)
ad.setActionListener("AddValuesUser");
else
ad.setActionListener("SelectPermission");
ad.setActionType(ActionData.TYPE_ICON);
ad.setCssIconClass(string + "Icon");
ad.setActionParameter(files[i] + "," + String.valueOf(j));
actionData.add(ad);
++j;
}
inputset.setActionField(files[i], actionData);
}
addChild(inputset);
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public String getParentId() {
return parentId_;
}
public void setParentId(String s) {
parentId_ = s;
}
public void updateSelect(String selectField, String value) throws Exception {
UIFormTextAreaInput fieldInput = getUIFormTextAreaInput(selectField);
String oldValue = fieldInput.getValue();
if (oldValue != null && oldValue.trim().length() > 0) {
oldValue = oldValue + "," + value;
} else
oldValue = value;
fieldInput.setValue(oldValue);
}
public void setCategoryValue(Category cat, boolean isUpdate) throws Exception {
if (isUpdate) {
isAddNew_ = false;
categoryId_ = cat.getPath();
currentCategory_ = cat;
oldName_ = cat.getName();
if (oldName_ != null && oldName_.trim().length() > 0)
getUIStringInput(FIELD_NAME_INPUT).setValue(oldName_);
else
getUIStringInput(FIELD_NAME_INPUT).setValue("Root");
String userPrivate = null;
if (cat.getUserPrivate() != null) {
for (String str : cat.getUserPrivate()) {
if (userPrivate != null)
userPrivate = userPrivate + ", " + str;
else
userPrivate = str;
}
}
getUIFormTextAreaInput(FIELD_USERPRIVATE_INPUT).setDefaultValue(userPrivate);
getUIStringInput(FIELD_INDEX_INPUT).setValue(String.valueOf(cat.getIndex()));
getUIFormTextAreaInput(FIELD_DESCRIPTION_INPUT).setDefaultValue(cat.getDescription());
getUIFormCheckBoxInput(FIELD_MODERATEQUESTIONS_CHECKBOX).setChecked(cat.isModerateQuestions());
getUIFormCheckBoxInput(FIELD_MODERATE_ANSWERS_CHECKBOX).setChecked(cat.isModerateAnswers());
getUIFormCheckBoxInput(VIEW_AUTHOR_INFOR).setChecked(cat.isViewAuthorInfor());
StringBuilder moderator = new StringBuilder();
if (cat.getModerators() != null && cat.getModerators().length > 0)
for (String str : cat.getModerators()) {
if (moderator.length() > 0)
moderator.append(",");
moderator.append(str);
}
if (moderator.length() > 0)
getUIFormTextAreaInput(FIELD_MODERATOR_INPUT).setValue(moderator.toString());
else
getUIFormTextAreaInput(FIELD_MODERATOR_INPUT).setValue(FAQUtils.getCurrentUser());
}
}
public String cutColonCaret(String name) {
StringBuffer string = new StringBuffer();
char c;
for (int i = 0; i < name.length(); i++) {
c = name.charAt(i);
if (c == 58 || c == 47)
continue;
string.append(c);
}
return string.toString();
}
static public class SaveActionListener extends EventListener<UICategoryForm> {
public void execute(Event<UICategoryForm> event) throws Exception {
UICategoryForm uiCategory = event.getSource();
String name = uiCategory.getUIStringInput(FIELD_NAME_INPUT).getValue();
name = Utils.encodeSpecialCharInTitle(name);
if (uiCategory.isAddNew_) {
if (uiCategory.getFAQService().isCategoryExist(name, uiCategory.parentId_)) {
uiCategory.warning("UICateforyForm.sms.cate-name-exist");
return;
}
} else {
if (!name.equals(uiCategory.oldName_) && uiCategory.getFAQService().isCategoryExist(name, uiCategory.parentId_)) {
uiCategory.warning("UICateforyForm.sms.cate-name-exist");
return;
}
}
UIFormInputWithActions inputset = uiCategory.getChildById(CATEGORY_DETAIL_TAB);
long index = 1;
String strIndex = inputset.getUIStringInput(FIELD_INDEX_INPUT).getValue();
UIAnswersPortlet answerPortlet = uiCategory.getAncestorOfType(UIAnswersPortlet.class);
if (strIndex != null && strIndex.trim().length() > 0) {
try {
index = Long.parseLong(strIndex);
} catch (Exception e) {
uiCategory.warning("NameValidator.msg.erro-large-number", new String[] { uiCategory.getLabel(FIELD_INDEX_INPUT) });
return;
}
long indexLimited = uiCategory.getFAQService().getMaxindexCategory(uiCategory.parentId_);
if (uiCategory.isAddNew_) indexLimited += 1;
if (index > indexLimited) {
uiCategory.warning("UICateforyForm.msg.over-index-number");
return;
}
}
if (index > uiCategory.maxIndex)
index = uiCategory.maxIndex;
String description = inputset.getUIFormTextAreaInput(FIELD_DESCRIPTION_INPUT).getValue();
String moderator = inputset.getUIFormTextAreaInput(FIELD_MODERATOR_INPUT).getValue();
if (moderator == null || moderator.trim().length() <= 0) {
uiCategory.warning("UICategoryForm.msg.moderator-required");
return;
}
String userPrivate = inputset.getUIFormTextAreaInput(FIELD_USERPRIVATE_INPUT).getValue();
String erroUser = UserHelper.checkValueUser(userPrivate);
if (!FAQUtils.isFieldEmpty(erroUser)) {
uiCategory.warning("UICateforyForm.sms.user-not-found", new String[] { uiCategory.getLabel(FIELD_USERPRIVATE_INPUT), erroUser });
return;
}
String[] userPrivates = new String[] { "" };
if (userPrivate != null && userPrivate.trim().length() > 0) {
userPrivates = FAQUtils.splitForFAQ(userPrivate);
}
/*
* moderator = uiCategory.removeSpaceInString(moderator) ; moderator = uiCategory.filterItemInString(moderator) ;
*/
erroUser = UserHelper.checkValueUser(moderator);
if (!FAQUtils.isFieldEmpty(erroUser)) {
uiCategory.warning("UICateforyForm.sms.user-not-found", new String[] { uiCategory.getLabel(FIELD_MODERATOR_INPUT), erroUser });
return;
}
Boolean moderatequestion = inputset.getUIFormCheckBoxInput(FIELD_MODERATEQUESTIONS_CHECKBOX).isChecked();
Boolean moderateAnswer = inputset.getUIFormCheckBoxInput(FIELD_MODERATE_ANSWERS_CHECKBOX).isChecked();
boolean viewAuthorInfor = inputset.getUIFormCheckBoxInput(VIEW_AUTHOR_INFOR).isChecked();
String[] users = FAQUtils.splitForFAQ(moderator);
// UIQuestions questions = answerPortlet.findFirstComponentOfType(UIQuestions.class) ;
// SessionProvider sessionProvider = FAQUtils.getSystemProvider();
Category cat;
if (uiCategory.isAddNew_) {
cat = new Category();
cat.setCreatedDate(new Date());
} else {
cat = uiCategory.currentCategory_;
}
cat.setName(name.trim());
cat.setUserPrivate(userPrivates);
cat.setDescription(description);
cat.setModerateQuestions(moderatequestion);
cat.setModerateAnswers(moderateAnswer);
cat.setViewAuthorInfor(viewAuthorInfor);
cat.setIndex(index);
cat.setModerators(users);
uiCategory.getFAQService().saveCategory(uiCategory.parentId_, cat, uiCategory.isAddNew_);
if (!uiCategory.isAddNew_) {
UICategories categories = answerPortlet.findFirstComponentOfType(UICategories.class);
if (uiCategory.categoryId_.equals(categories.getCategoryPath())) {
UIQuestions questions = answerPortlet.findFirstComponentOfType(UIQuestions.class);
questions.viewAuthorInfor = uiCategory.getFAQService().isViewAuthorInfo(uiCategory.categoryId_);
}
}
answerPortlet.cancelAction();
// questions.setQuestions() ; //?
event.getRequestContext().addUIComponentToUpdateByAjax(answerPortlet);
}
}
static public class SelectPermissionActionListener extends BaseEventListener<UICategoryForm> {
public void onEvent(Event<UICategoryForm> event, UICategoryForm categoryForm, String permType) throws Exception {
String types[] = permType.split(",");
UIPopupContainer popupContainer = categoryForm.getAncestorOfType(UIPopupContainer.class);
UIUserSelect uiUserSelect = popupContainer.findFirstComponentOfType(UIUserSelect.class);
if (uiUserSelect != null) {
UIPopupWindow popupWindow = uiUserSelect.getParent();
popupWindow.setShow(false);
popupWindow.setUIComponent(null);
popupWindow.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(popupWindow.getParent());
}
UIGroupSelector uiGroupSelector = null;
if (types[1].equals(UISelectComponent.TYPE_GROUP)) {
uiGroupSelector = openPopup(popupContainer, UIGroupSelector.class, "GroupSelector", 550, 0);
} else if (types[1].equals(UISelectComponent.TYPE_MEMBERSHIP)) {
uiGroupSelector = openPopup(popupContainer, UIGroupSelector.class, "UIMemberShipSelector", 550, 0);
}
uiGroupSelector.setType(types[1]);
uiGroupSelector.setSelectedGroups(null);
uiGroupSelector.setComponent(categoryForm, new String[] { types[0] });
uiGroupSelector.getChild(UITree.class).setId(UIGroupSelector.TREE_GROUP_ID);
uiGroupSelector.getChild(org.exoplatform.webui.core.UIBreadcumbs.class).setId(UIGroupSelector.BREADCUMB_GROUP_ID);
}
}
static public class CancelActionListener extends EventListener<UICategoryForm> {
public void execute(Event<UICategoryForm> event) throws Exception {
UICategoryForm uiCategory = event.getSource();
UIPopupAction uiPopupAction = uiCategory.getAncestorOfType(UIPopupAction.class);
uiPopupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupAction);
}
}
static public class CloseActionListener extends EventListener<UIUserSelector> {
public void execute(Event<UIUserSelector> event) throws Exception {
UIUserSelector uiUserSelector = event.getSource();
UIPopupWindow popupWindow = uiUserSelector.getParent();
popupWindow.setUIComponent(null);
popupWindow.setShow(false);
popupWindow.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(popupWindow.getParent());
}
}
static public class ClosePopupActionListener extends EventListener<UIPopupWindow> {
public void execute(Event<UIPopupWindow> event) throws Exception {
UIPopupWindow popupWindow = event.getSource();
popupWindow.setUIComponent(null);
popupWindow.setShow(false);
popupWindow.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(popupWindow.getParent());
}
}
private String getUserSelect(String vls, String values) throws Exception {
try {
if (!FAQUtils.isFieldEmpty(vls)) {
values = values + "," + vls;
List<String> list = new ArrayList<String>();
for (String string : Arrays.asList(values.split(","))) {
if (!list.contains(string) && string.trim().length() > 0)
list.add(string);
}
values = list.toString().replace('[' + "", "").replace(']' + "", "").replaceAll(", ", ",");
}
} catch (Exception e) {
log.error("Fail to get user selector: ", e);
}
return values;
}
static public class AddActionListener extends EventListener<UIUserSelect> {
public void execute(Event<UIUserSelect> event) throws Exception {
UIUserSelect uiUserSelector = event.getSource();
String values = uiUserSelector.getSelectedUsers();
UIAnswersPortlet answerPortlet = uiUserSelector.getAncestorOfType(UIAnswersPortlet.class);
UICategoryForm categoryForm = answerPortlet.findFirstComponentOfType(UICategoryForm.class);
UIPopupWindow popupWindow = uiUserSelector.getParent();
String id = uiUserSelector.getPermisionType();
UIFormInputWithActions inputset = categoryForm.getChildById(CATEGORY_DETAIL_TAB);
if (id.equals(FIELD_USERPRIVATE_INPUT)) {
UIFormTextAreaInput textAreaInput = inputset.getUIFormTextAreaInput(FIELD_USERPRIVATE_INPUT);
textAreaInput.setValue(categoryForm.getUserSelect(textAreaInput.getValue(), values));
} else {
UIFormTextAreaInput stringInput = inputset.getUIFormTextAreaInput(FIELD_MODERATOR_INPUT);
stringInput.setValue(categoryForm.getUserSelect(stringInput.getValue(), values));
}
popupWindow.setUIComponent(null);
popupWindow.setShow(false);
popupWindow.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(popupWindow.getParent());
event.getRequestContext().addUIComponentToUpdateByAjax(categoryForm);
}
}
static public class AddValuesUserActionListener extends EventListener<UICategoryForm> {
public void execute(Event<UICategoryForm> event) throws Exception {
UICategoryForm categoryForm = event.getSource();
String id = event.getRequestContext().getRequestParameter(OBJECTID).replace(",0", "");
UIPopupContainer uiPopupContainer = categoryForm.getAncestorOfType(UIPopupContainer.class);
UIGroupSelector uiGroupSelector = uiPopupContainer.findFirstComponentOfType(UIGroupSelector.class);
if (uiGroupSelector != null) {
UIPopupWindow popupWindow = uiGroupSelector.getAncestorOfType(UIPopupWindow.class);
popupWindow.setUIComponent(null);
popupWindow.setShow(false);
popupWindow.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(popupWindow.getParent());
}
UIPopupWindow uiPopupWindow = uiPopupContainer.getChildById(USER_SELECTOR_POPUPWINDOW);
if (uiPopupWindow == null)
uiPopupWindow = uiPopupContainer.addChild(UIPopupWindow.class, USER_SELECTOR_POPUPWINDOW, USER_SELECTOR_POPUPWINDOW);
UIUserSelect uiUserSelector = uiPopupContainer.createUIComponent(UIUserSelect.class, null, "UIUserSelector");
uiUserSelector.setShowSearch(true);
uiUserSelector.setShowSearchUser(true);
uiUserSelector.setShowSearchGroup(false);
uiPopupWindow.setUIComponent(uiUserSelector);
uiPopupWindow.setShow(true);
uiPopupWindow.setWindowSize(740, 400);
uiPopupWindow.setRendered(true);
uiUserSelector.setPermisionType(id);
uiPopupContainer.setRendered(true);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupContainer);
}
}
}