/* * 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.List; import java.util.ResourceBundle; import org.exoplatform.container.PortalContainer; import org.exoplatform.faq.service.Cate; import org.exoplatform.faq.service.FAQService; import org.exoplatform.faq.service.FAQSetting; import org.exoplatform.faq.service.JCRPageList; import org.exoplatform.faq.service.Question; import org.exoplatform.faq.service.Utils; import org.exoplatform.faq.webui.BaseUIFAQForm; import org.exoplatform.faq.webui.FAQUtils; import org.exoplatform.faq.webui.UIAnswersPageIterator; import org.exoplatform.faq.webui.UIAnswersPortlet; import org.exoplatform.faq.webui.UIQuestions; import org.exoplatform.ks.common.webui.BaseEventListener; import org.exoplatform.ks.common.webui.UIPopupAction; import org.exoplatform.ks.common.webui.UIPopupContainer; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupComponent; 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.UIFormSelectBox; /** * Created by The eXo Platform SARL * Author : Ha Mai * ha.mai@exoplatform.com * May 15, 2008 ,4:09:44 AM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/templates/faq/webui/popup/UIQuestionsInfo.gtmpl", events = { @EventConfig(listeners = UIQuestionsInfo.ChangeCategoryActionListener.class), @EventConfig(listeners = UIQuestionsInfo.CloseActionListener.class), @EventConfig(listeners = UIQuestionsInfo.EditQuestionActionListener.class), @EventConfig(listeners = UIQuestionsInfo.DeleteQuestionActionListener.class), @EventConfig(listeners = UIQuestionsInfo.ChangeTabActionListener.class), @EventConfig(listeners = UIQuestionsInfo.ChangeQuestionStatusActionListener.class), @EventConfig(listeners = UIQuestionsInfo.ResponseQuestionActionListener.class) } ) @SuppressWarnings("unused") public class UIQuestionsInfo extends BaseUIFAQForm implements UIPopupComponent { private static final String LIST_QUESTION_INTERATOR = "FAQUserPageIteratorTab1"; private static final String LIST_QUESTION_NOT_ANSWERED_INTERATOR = "FAQUserPageIteratorTab2"; private static final String LIST_CATEGORIES = "ListCategories"; private FAQSetting faqSetting_ = new FAQSetting(); private JCRPageList pageList; private JCRPageList pageListNotAnswer; private UIAnswersPageIterator pageIterator; private UIAnswersPageIterator pageQuesNotAnswerIterator; private List<Question> listQuestion_ = new ArrayList<Question>(); private List<Question> listQuestionNotYetAnswered_ = new ArrayList<Question>(); private List<SelectItemOption<String>> listCategories = new ArrayList<SelectItemOption<String>>(); private long pageSelect = 1; private long pageSelectNotAnswer = 1; private List<String> moderateCates = new ArrayList<String>(); private boolean isEditTab_ = true; private boolean isResponseTab_ = false; private boolean isChangeTab_ = false; private String cateId_ = Utils.ALL; public void activate() throws Exception { } public void deActivate() throws Exception { } public UIQuestionsInfo() throws Exception { isEditTab_ = true; isResponseTab_ = false; addChild(UIAnswersPageIterator.class, null, LIST_QUESTION_INTERATOR); addChild(UIAnswersPageIterator.class, null, LIST_QUESTION_NOT_ANSWERED_INTERATOR); setActions(new String[] { "" }); } public void setFAQSetting(FAQSetting setting) throws Exception { this.faqSetting_ = setting; FAQUtils.getEmailSetting(faqSetting_, false, false); setListCate(); UIFormSelectBox selectCategory = new UIFormSelectBox(LIST_CATEGORIES, LIST_CATEGORIES, listCategories); selectCategory.setOnChange("ChangeCategory"); this.addUIFormInput(selectCategory); setListQuestion(); } private boolean hasInGroup(List<String> listGroup, String[] listPermission) { for (String per : listPermission) { if (per != null && per.trim().length() > 0 && listGroup.contains(per)) return true; } return false; } private void setListCate() throws Exception { WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); ResourceBundle res = context.getApplicationResourceBundle(); this.listCategories.add(new SelectItemOption<String>(res.getString("UIQuestionsInfo.label.All"), Utils.ALL)); FAQService faqService = (FAQService) PortalContainer.getInstance().getComponentInstanceOfType(FAQService.class); if (faqSetting_.isAdmin()) { List<Cate> listCate = faqService.listingCategoryTree(); this.listCategories.add(new SelectItemOption<String>(getFAQService().getCategoryNameOf(Utils.CATEGORY_HOME), Utils.CATEGORY_HOME)); for (Cate cat : listCate) { this.listCategories.add(new SelectItemOption<String>(cat.getCategory().getName(), cat.getCategory().getPath())); } } else { List<String> listCate = getFAQService().getListCateIdByModerator(FAQUtils.getCurrentUser()); moderateCates.clear(); for (String str : listCate) { try { this.listCategories.add(new SelectItemOption<String>(str.substring(40), str.substring(0, 40))); moderateCates.add(str.substring(0, 40)); } catch (StringIndexOutOfBoundsException e) { if (str.indexOf(Utils.CATEGORY_HOME) == 0) { this.listCategories.add(new SelectItemOption<String>(str.substring(Utils.CATEGORY_HOME.length()), Utils.CATEGORY_HOME)); moderateCates.add(Utils.CATEGORY_HOME); } } catch (Exception e) { log.error("Can not set List Category, exception: " + e.getMessage()); } } } } private String[] getQuestionActions() { return new String[] { "AddLanguage", "Attachment", "Save", "Close" }; } private String[] getQuestionNotAnsweredActions() { return new String[] { "QuestionRelation", "Attachment", "Save", "Close" }; } private String[] getTab() { return new String[] { "Question managerment", "Question not yet answered" }; } private boolean getIsEdit() { return isEditTab_; } private boolean getIsResponse() { return isResponseTab_; } private long getTotalpages(String pageInteratorId) { UIAnswersPageIterator pageIterator = this.getChildById(pageInteratorId); try { return pageIterator.getInfoPage().get(3); } catch (Exception e) { log.error("Can not get tatal pages, exception: " + e.getMessage()); return 1; } } public void setListQuestion() throws Exception { listQuestion_.clear(); listQuestionNotYetAnswered_.clear(); pageIterator = this.getChildById(LIST_QUESTION_INTERATOR); pageQuesNotAnswerIterator = this.getChildById(LIST_QUESTION_NOT_ANSWERED_INTERATOR); if (faqSetting_.isAdmin()) { if (this.cateId_.equals(Utils.ALL)) { this.pageList = getFAQService().getAllQuestions(); pageListNotAnswer = getFAQService().getQuestionsNotYetAnswer(Utils.ALL, false); } else { String cateId = cateId_; if (cateId.indexOf("/") > 0) cateId = cateId.substring(cateId.lastIndexOf("/") + 1); this.pageList = getFAQService().getAllQuestionsByCatetory(cateId, this.faqSetting_); pageListNotAnswer = getFAQService().getQuestionsNotYetAnswer(cateId, false); } this.pageList.setPageSize(5); pageIterator.updatePageList(this.pageList); pageListNotAnswer.setPageSize(5); pageQuesNotAnswerIterator.updatePageList(pageListNotAnswer); } else { List<String> listCateId = new ArrayList<String>(); if (cateId_.equals(Utils.ALL)) { listCateId.addAll(moderateCates); } else { if (cateId_.indexOf("/") > 0) listCateId.add(cateId_.substring(cateId_.lastIndexOf("/") + 1)); else listCateId.add(cateId_); } if (listCateId.size() > 0) { this.pageList = getFAQService().getQuestionsByListCatetory(listCateId, false); this.pageList.setPageSize(5); pageIterator.updatePageList(this.pageList); this.pageListNotAnswer = getFAQService().getQuestionsByListCatetory(listCateId, true); this.pageListNotAnswer.setPageSize(5); pageQuesNotAnswerIterator.updatePageList(this.pageListNotAnswer); } } } private String getCategoryPath(String questionPath) { try { return getFAQService().getParentCategoriesName(questionPath.substring(0, questionPath.indexOf("/" + Utils.QUESTION_HOME))); } catch (Exception e) { log.error("Can not get category path, exception: " + e.getMessage()); return questionPath; } } private List<Question> getListQuestion() { if (!isChangeTab_) { pageSelect = pageIterator.getPageSelected(); listQuestion_ = new ArrayList<Question>(); try { listQuestion_.addAll(this.pageList.getPage(pageSelect, null)); if (listQuestion_.isEmpty()) { UIAnswersPageIterator pageIterator = null; while (listQuestion_.isEmpty() && pageSelect > 1) { pageIterator = this.getChildById(LIST_QUESTION_INTERATOR); listQuestion_.addAll(this.pageList.getPage(--pageSelect, null)); pageIterator.setSelectPage(pageSelect); } } } catch (Exception e) { log.error("Can not get list Question, exception: " + e.getMessage()); } } isChangeTab_ = false; return listQuestion_; } /** * Gets the list question not answered. * * @return the list question not answered */ private List<Question> getListQuestionNotAnswered() { if (!isChangeTab_) { pageSelectNotAnswer = pageQuesNotAnswerIterator.getPageSelected(); listQuestionNotYetAnswered_.clear(); try { listQuestionNotYetAnswered_.addAll(this.pageListNotAnswer.getPage(pageSelectNotAnswer, null)); UIAnswersPageIterator pageIterator = null; while (listQuestionNotYetAnswered_.isEmpty() && pageSelectNotAnswer > 1) { pageIterator = this.getChildById(LIST_QUESTION_NOT_ANSWERED_INTERATOR); listQuestionNotYetAnswered_.addAll(this.pageListNotAnswer.getPage(--pageSelectNotAnswer, null)); pageIterator.setSelectPage(pageSelectNotAnswer); } } catch (Exception e) { log.error("Can not get list Question not Answered, exception: " + e.getMessage()); } } isChangeTab_ = false; return listQuestionNotYetAnswered_; } static public class EditQuestionActionListener extends BaseEventListener<UIQuestionsInfo> { @SuppressWarnings("static-access") public void onEvent(Event<UIQuestionsInfo> event, UIQuestionsInfo questionsInfo, String quesId) throws Exception { UIQuestionManagerForm questionManagerForm = questionsInfo.getAncestorOfType(UIQuestionManagerForm.class); try { Question question = questionsInfo.getFAQService().getQuestionById(quesId); UIQuestionForm questionForm = questionManagerForm.getChildById(questionManagerForm.UI_QUESTION_FORM); questionForm.setFAQSetting(questionsInfo.faqSetting_); questionForm.setIsChildOfManager(true); questionForm.setQuestion(question); questionManagerForm.isViewEditQuestion = true; questionManagerForm.isViewResponseQuestion = false; questionManagerForm.isEditQuestion = true; } catch (Exception e) { UIApplication uiApplication = questionsInfo.getAncestorOfType(UIApplication.class); uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.question-id-deleted", null, ApplicationMessage.WARNING)); event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages()); for (int i = 0; i < questionsInfo.listQuestion_.size(); i++) { if (questionsInfo.listQuestion_.get(i).getId().equals(quesId)) { questionsInfo.listQuestion_.remove(i); break; } } } UIPopupContainer popupContainer = questionManagerForm.getAncestorOfType(UIPopupContainer.class); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class ResponseQuestionActionListener extends BaseEventListener<UIQuestionsInfo> { public void onEvent(Event<UIQuestionsInfo> event, UIQuestionsInfo questionsInfo, String ids) throws Exception { String questionId = ids.substring(0, ids.lastIndexOf("/")); String language = ids.substring(ids.lastIndexOf("/") + 1); UIQuestionManagerForm questionManagerForm = questionsInfo.getAncestorOfType(UIQuestionManagerForm.class); try { Question question = questionsInfo.getFAQService().getQuestionById(questionId); boolean isModerateAnswer = questionsInfo.getFAQService().isModerateAnswer(question.getPath()); UIResponseForm responseForm = questionManagerForm.getChildById(questionManagerForm.UI_RESPONSE_FORM); responseForm.setFAQSetting(questionsInfo.faqSetting_); responseForm.updateChildOfQuestionManager(true); responseForm.setModertator(true); /* * if(param.length == 1) responseForm.setQuestionId(question, null, isModerateAnswer) ; else */ responseForm.setQuestionId(question, language, isModerateAnswer); questionManagerForm.isViewEditQuestion = false; questionManagerForm.isViewResponseQuestion = true; questionManagerForm.isResponseQuestion = true; } catch (Exception e) { warning("UIQuestions.msg.question-id-deleted"); for (int i = 0; i < questionsInfo.listQuestion_.size(); i++) { if (questionsInfo.listQuestion_.get(i).getPath().equals(questionId)) { questionsInfo.listQuestion_.remove(i); break; } } } UIPopupContainer popupContainer = questionManagerForm.getAncestorOfType(UIPopupContainer.class); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class DeleteQuestionActionListener extends BaseEventListener<UIQuestionsInfo> { public void onEvent(Event<UIQuestionsInfo> event, UIQuestionsInfo questionsInfo, String questionId) throws Exception { UIPopupContainer popupContainer = questionsInfo.getAncestorOfType(UIPopupContainer.class); UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class).setRendered(true); try { Question question = questionsInfo.getFAQService().getQuestionById(questionId); UIDeleteQuestion deleteQuestion = popupAction.activate(UIDeleteQuestion.class, 500); deleteQuestion.setQuestionId(question); deleteQuestion.setIsManagement(true); deleteQuestion.setId("Confirm Delete"); UIQuestionManagerForm questionManagerForm = questionsInfo.getParent(); if (questionManagerForm.isEditQuestion) { UIQuestionForm questionForm = questionManagerForm.getChild(UIQuestionForm.class); questionForm.setIsMode(true); if (questionForm.getQuestionId().equals(questionId)) { questionManagerForm.isEditQuestion = false; } } if (questionManagerForm.isResponseQuestion) { UIResponseForm responseForm = questionManagerForm.getChild(UIResponseForm.class); if (responseForm.questionId_.equals(questionId)) { questionManagerForm.isResponseQuestion = false; } } // event.getRequestContext().addUIComponentToUpdateByAjax(popupAction) ; } catch (Exception e) { warning("UIQuestions.msg.question-id-deleted"); for (int i = 0; i < questionsInfo.listQuestion_.size(); i++) { if (questionsInfo.listQuestion_.get(i).getId().equals(questionId)) { questionsInfo.listQuestion_.remove(i); break; } } } event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class ChangeCategoryActionListener extends EventListener<UIQuestionsInfo> { public void execute(Event<UIQuestionsInfo> event) throws Exception { UIQuestionsInfo questionsInfo = event.getSource(); String cateId = ((UIFormSelectBox) questionsInfo.getChildById(LIST_CATEGORIES)).getValue(); questionsInfo.cateId_ = cateId; questionsInfo.setListQuestion(); UIQuestionManagerForm questionManagerForm = questionsInfo.getAncestorOfType(UIQuestionManagerForm.class); questionManagerForm.isResponseQuestion = false; questionManagerForm.isEditQuestion = false; UIPopupContainer popupContainer = questionsInfo.getAncestorOfType(UIPopupContainer.class); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class CloseActionListener extends EventListener<UIQuestionsInfo> { public void execute(Event<UIQuestionsInfo> event) throws Exception { UIQuestionsInfo questionManagerForm = event.getSource(); UIAnswersPortlet portlet = questionManagerForm.getAncestorOfType(UIAnswersPortlet.class); UIPopupAction popupAction = portlet.getChild(UIPopupAction.class); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class ChangeTabActionListener extends BaseEventListener<UIQuestionsInfo> { public void onEvent(Event<UIQuestionsInfo> event, UIQuestionsInfo questionsInfo, String idTab) throws Exception { UIQuestionManagerForm questionManagerForm = questionsInfo.getAncestorOfType(UIQuestionManagerForm.class); if (idTab.equals("0")) { questionsInfo.isEditTab_ = true; questionsInfo.isResponseTab_ = false; questionManagerForm.isViewEditQuestion = true; questionManagerForm.isViewResponseQuestion = false; } else { questionsInfo.isEditTab_ = false; questionsInfo.isResponseTab_ = true; questionManagerForm.isViewEditQuestion = false; questionManagerForm.isViewResponseQuestion = true; } questionsInfo.isChangeTab_ = true; UIPopupContainer popupContainer = questionManagerForm.getAncestorOfType(UIPopupContainer.class); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class ChangeQuestionStatusActionListener extends BaseEventListener<UIQuestionsInfo> { public void onEvent(Event<UIQuestionsInfo> event, UIQuestionsInfo questionsInfo, String ids) throws Exception { String action = ids.substring(0, ids.indexOf("/")); String questionId = ids.substring(ids.indexOf("/") + 1); try { Question question = questionsInfo.getFAQService().getQuestionById(questionId); if (action.equals("approved")) { question.setApproved(!question.isApproved()); } else { question.setActivated(!question.isActivated()); } FAQUtils.getEmailSetting(questionsInfo.faqSetting_, false, true); questionsInfo.getFAQService().saveQuestion(question, false, questionsInfo.faqSetting_); UIAnswersPortlet portlet = questionsInfo.getAncestorOfType(UIAnswersPortlet.class); UIQuestions questions = portlet.findFirstComponentOfType(UIQuestions.class); questions.setDefaultLanguage(); questions.updateCurrentQuestionList(); if (question.getPath().equals(questions.viewingQuestionId_)) { questions.updateLanguageMap(); } event.getRequestContext().addUIComponentToUpdateByAjax(questions); } catch (Exception e) { questionsInfo.log.error("Can not Change Question Status, exception: " + e.getMessage()); warning("UIQuestions.msg.question-id-deleted"); } event.getRequestContext().addUIComponentToUpdateByAjax(questionsInfo.getAncestorOfType(UIPopupContainer.class)); } } }