/*
* Copyright (C) 2003-2008 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.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.exoplatform.commons.utils.ObjectPageList;
import org.exoplatform.commons.utils.PageList;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.faq.webui.SelectItem;
import org.exoplatform.faq.webui.SelectOption;
import org.exoplatform.faq.webui.UIAnswersPortlet;
import org.exoplatform.faq.webui.UIFormSelectBoxWithGroups;
import org.exoplatform.ks.common.UserHelper;
import org.exoplatform.ks.common.webui.BaseUIForm;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.Query;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.idm.ExtGroup;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.core.UIPopupComponent;
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.UIFormStringInput;
/**
* Created by The eXo Platform SARL
* Author : Truong Nguyen
* truong.nguyen@exoplatform.com
* Oct 2, 2008, 10:47:27 AM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/faq/webui/popup/UIAddressEmailsForm.gtmpl",
events = {
@EventConfig(listeners = UIAddressEmailsForm.AddActionListener.class),
@EventConfig(listeners = UIAddressEmailsForm.SearchActionListener.class),
@EventConfig(listeners = UIAddressEmailsForm.ChangeGroupActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIAddressEmailsForm.ShowPageActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIAddressEmailsForm.CancelActionListener.class, phase = Phase.DECODE)
}
)
public class UIAddressEmailsForm extends BaseUIForm implements UIPopupComponent {
public static final String USER_SEARCH = "user-search".intern();
public static final String USER_GROUP = "user-group".intern();
public Map<String, User> checkedList_ = new HashMap<String, User>();
public Map<String, User> newCheckedList_ = new HashMap<String, User>();
private static final String FILED_ALL_GROUP = "all-group";
private String selectedAddressId_ = "";
private String recipientsType_ = "";
private UIPageIterator uiPageList_;
public void setRecipientsType(String type) {
recipientsType_ = type;
}
public String getRecipientType() {
return recipientsType_;
}
public UIAddressEmailsForm() throws Exception {
addUIFormInput(new UIFormStringInput(USER_SEARCH, USER_SEARCH, null));
UIFormSelectBoxWithGroups uiSelect = new UIFormSelectBoxWithGroups(USER_GROUP, USER_GROUP, getOptions());
uiSelect.setOnChange("ChangeGroup");
addUIFormInput(uiSelect);
uiPageList_ = new UIPageIterator();
try {
setUserList(UserHelper.getPageListUser());
} catch (Exception e) {
log.error("Can not set users list, exception: " + e.getMessage());
}
}
public List<SelectItem> getOptions() throws Exception {
List<SelectItem> options = new ArrayList<SelectItem>();
options.add(new SelectOption(FILED_ALL_GROUP, FILED_ALL_GROUP));
try {
List<String> groupIds = UserHelper.getAllGroupId();
if (!groupIds.isEmpty()) {
for (String publicCg : groupIds) {
options.add(new SelectOption(publicCg, publicCg));
}
}
} catch (Exception e) {
log.error("Can not get all groups user , exception: ", e);
}
return options;
}
private void searchUserProfileByKey(String keyWord) throws Exception {
try {
Set<User> users = new HashSet<User>();
OrganizationService service = this.getApplicationComponent(OrganizationService.class);
keyWord = "*" + keyWord + "*";
Query q;
// search by user name
q = new Query();
q.setUserName(keyWord);
for (Object obj : service.getUserHandler().findUsers(q).getAll()) {
users.add((User) obj);
}
// search by last name
q = new Query();
q.setLastName(keyWord);
for (Object obj : service.getUserHandler().findUsers(q).getAll()) {
users.add((User) obj);
}
// search by firstname
q = new Query();
q.setFirstName(keyWord);
for (Object obj : service.getUserHandler().findUsers(q).getAll()) {
users.add((User) obj);
}
// search by email
q = new Query();
q.setEmail(keyWord);
for (Object obj : service.getUserHandler().findUsers(q).getAll()) {
users.add((User) obj);
}
ObjectPageList<User> objPageList = new ObjectPageList<User>((new ArrayList<User>(users)), 10);
uiPageList_.setPageList(objPageList);
} catch (Exception e) {
log.error("Can not search user by key, exception: " + e.getMessage());
}
}
@SuppressWarnings("unchecked")
public List<User> getUsers() throws Exception {
List<User> users = new ArrayList<User>(uiPageList_.getCurrentPageData());
for (User c : users) {
UIFormCheckBoxInput uiInput = getUIFormCheckBoxInput(c.getUserName());
if (uiInput == null)
addUIFormInput(new UIFormCheckBoxInput<Boolean>(c.getUserName(), c.getUserName(), null));
}
for (User c : checkedList_.values()) {
UIFormCheckBoxInput uiInput = getUIFormCheckBoxInput(c.getUserName());
if (uiInput != null)
uiInput.setChecked(true);
}
return users;
}
public void setUserList(PageList<User> userList) throws Exception {
uiPageList_.setPageList(userList);
}
public void setAlreadyCheckedUser(List<User> alreadyCheckedUser) throws Exception {
for (User ct : alreadyCheckedUser) {
checkedList_.put(ct.getUserName(), ct);
}
}
public String[] getActions() {
return new String[] { "Save", "Cancel" };
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public UIPageIterator getUIPageIterator() {
return uiPageList_;
}
public long getAvailablePage() {
return uiPageList_.getAvailablePage();
}
public long getCurrentPage() {
return uiPageList_.getCurrentPage();
}
protected void updateCurrentPage(int page) throws Exception {
uiPageList_.setCurrentPage(page);
}
@SuppressWarnings("unchecked")
public List<User> getCheckedUser() throws Exception {
List<User> userList = new ArrayList<User>();
for (User user : new ArrayList<User>(uiPageList_.getCurrentPageData())) {
UIFormCheckBoxInput<Boolean> uiCheckbox = getChildById(user.getUserName());
if (uiCheckbox != null && uiCheckbox.isChecked()) {
userList.add(user);
}
}
return userList;
}
static public class AddActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
UIAddressEmailsForm uiAddressForm = event.getSource();
List<User> checkedUser = uiAddressForm.getCheckedUser();
if (checkedUser.size() <= 0) {
uiAddressForm.warning("UIAddressEmailsForm.msg.user-email-required");
return;
}
UIAnswersPortlet uiPortlet = uiAddressForm.getAncestorOfType(UIAnswersPortlet.class);
String toAddress = "";
StringBuffer sb = new StringBuffer();
for (User ct : checkedUser) {
uiAddressForm.newCheckedList_.put(ct.getUserName(), ct);
}
for (User user : uiAddressForm.newCheckedList_.values()) {
if (user.getEmail() != null)
toAddress += user.getFullName() + "<" + user.getEmail() + "> ,";
}
List<String> listMail = Arrays.asList(sb.toString().split(","));
String email = null;
for (User c : checkedUser) {
email = c.getEmail();
if (!listMail.contains(email)) {
if (sb != null && sb.length() > 0)
sb.append(",");
if (email != null)
sb.append(email);
}
}
UISendMailForm uiSendMailForm = uiPortlet.findFirstComponentOfType(UISendMailForm.class);
if (uiAddressForm.getRecipientType().equals("To")) {
uiSendMailForm.setFieldToValue(toAddress);
uiSendMailForm.setToUsers(new ArrayList<User>(uiAddressForm.newCheckedList_.values()));
} else if (uiAddressForm.getRecipientType().equals("AddCc")) {
uiSendMailForm.setFieldCCValue(toAddress);
uiSendMailForm.setAddCCUsers(new ArrayList<User>(uiAddressForm.newCheckedList_.values()));
} else if (uiAddressForm.getRecipientType().equals("AddBcc")) {
uiSendMailForm.setFieldBCCValue(toAddress);
uiSendMailForm.setAddBCCUsers(new ArrayList<User>(uiAddressForm.newCheckedList_.values()));
}
uiAddressForm.checkedList_ = uiAddressForm.newCheckedList_;
event.getRequestContext().addUIComponentToUpdateByAjax(uiSendMailForm);
event.getRequestContext().addUIComponentToUpdateByAjax(uiAddressForm.getParent());
}
}
static public class ReplaceActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
UIAddressEmailsForm uiAddressForm = event.getSource();
List<User> checkedUser = uiAddressForm.getCheckedUser();
if (checkedUser.isEmpty()) {
uiAddressForm.warning("UIAddressEmailsForm.msg.user-email-required");
return;
}
UIPopupContainer uiPopupContainer = uiAddressForm.getAncestorOfType(UIPopupContainer.class);
// UISendEmailsContainer uiPopupContainer = uiAddressForm.getAncestorOfType(UISendEmailsContainer.class) ;
uiAddressForm.checkedList_.clear();
uiAddressForm.newCheckedList_.clear();
String toAddress = "";
StringBuffer sb = new StringBuffer();
for (User ct : checkedUser) {
uiAddressForm.newCheckedList_.put(ct.getUserName(), ct);
}
for (User user : uiAddressForm.newCheckedList_.values()) {
if (user.getEmail() != null) {
toAddress += user.getFullName() + "<" + user.getEmail() + "> ,";
if (sb.length() > 0)
sb.append(",");
sb.append(user.getEmail());
}
}
UISendMailForm uiSendMailForm = uiPopupContainer.getChild(UISendMailForm.class);
if (uiAddressForm.getRecipientType().equals("to")) {
uiSendMailForm.setFieldToValue(toAddress);
uiSendMailForm.setToUsers(checkedUser);
}
if (uiAddressForm.getRecipientType().equals("AddCc")) {
uiSendMailForm.setFieldCCValue(toAddress);
uiSendMailForm.setAddCCUsers(checkedUser);
}
if (uiAddressForm.getRecipientType().equals("AddBcc")) {
uiSendMailForm.setFieldBCCValue(toAddress);
uiSendMailForm.setAddBCCUsers(checkedUser);
}
uiAddressForm.checkedList_ = uiAddressForm.newCheckedList_;
event.getRequestContext().addUIComponentToUpdateByAjax(uiSendMailForm);
uiAddressForm.cancelChildPopupAction();
}
}
static public class ChangeGroupActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
UIAddressEmailsForm uiAddressForm = event.getSource();
String group = ((UIFormSelectBoxWithGroups) uiAddressForm.getChildById(UIAddressEmailsForm.USER_GROUP)).getValue();
if (group.equals("all-group"))
uiAddressForm.setUserList(UserHelper.getPageListUser());
else
uiAddressForm.setUserList(UserHelper.getUserPageListByGroupId(group));
uiAddressForm.selectedAddressId_ = group;
uiAddressForm.getUIStringInput(UIAddressEmailsForm.USER_GROUP).setValue(null);
((UIFormSelectBoxWithGroups) uiAddressForm.getChildById(UIAddressEmailsForm.USER_GROUP)).setValue(uiAddressForm.selectedAddressId_);
event.getRequestContext().addUIComponentToUpdateByAjax(uiAddressForm);
}
}
static public class CancelActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
event.getSource().cancelChildPopupAction();
}
}
static public class ShowPageActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
UIAddressEmailsForm uiAddressForm = event.getSource();
int page = Integer.parseInt(event.getRequestContext().getRequestParameter(OBJECTID));
for (User user : uiAddressForm.getCheckedUser()) {
uiAddressForm.newCheckedList_.put(user.getUserName(), user);
uiAddressForm.checkedList_.put(user.getUserName(), user);
}
uiAddressForm.updateCurrentPage(page);
event.getRequestContext().addUIComponentToUpdateByAjax(uiAddressForm);
}
}
static public class SearchActionListener extends EventListener<UIAddressEmailsForm> {
public void execute(Event<UIAddressEmailsForm> event) throws Exception {
UIAddressEmailsForm uiAddressForm = event.getSource();
String searchValue = ((UIFormStringInput) uiAddressForm.getChildById(UIAddressEmailsForm.USER_SEARCH)).getValue();
if (searchValue == null || searchValue.trim().length() < 1)
uiAddressForm.setUserList(UserHelper.getPageListUser());
else
uiAddressForm.searchUserProfileByKey(searchValue);
event.getRequestContext().addUIComponentToUpdateByAjax(uiAddressForm);
}
}
}