/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.poll.tool.producers;
import java.util.ArrayList;
import java.util.List;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.tool.api.SessionManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.poll.logic.ExternalLogic;
import org.sakaiproject.poll.logic.PollListManager;
import org.sakaiproject.poll.logic.PollVoteManager;
import org.sakaiproject.poll.model.Option;
import org.sakaiproject.poll.model.Poll;
import org.sakaiproject.poll.model.Vote;
import org.sakaiproject.poll.tool.params.OptionViewParameters;
import org.sakaiproject.poll.tool.params.PollViewParameters;
import org.sakaiproject.poll.tool.params.VoteBean;
import org.sakaiproject.util.FormattedText;
import uk.org.ponder.messageutil.MessageLocator;
import uk.org.ponder.messageutil.TargettedMessage;
import uk.org.ponder.messageutil.TargettedMessageList;
import uk.org.ponder.rsf.components.UIBoundBoolean;
import uk.org.ponder.rsf.components.UIBranchContainer;
import uk.org.ponder.rsf.components.UICommand;
import uk.org.ponder.rsf.components.UIContainer;
import uk.org.ponder.rsf.components.UIELBinding;
import uk.org.ponder.rsf.components.UIForm;
import uk.org.ponder.rsf.components.UIInput;
import uk.org.ponder.rsf.components.UIInternalLink;
import uk.org.ponder.rsf.components.UIMessage;
import uk.org.ponder.rsf.components.UIOutputMany;
import uk.org.ponder.rsf.components.UISelect;
import uk.org.ponder.rsf.components.UISelectChoice;
import uk.org.ponder.rsf.components.UISelectLabel;
import uk.org.ponder.rsf.components.UIVerbatim;
import uk.org.ponder.rsf.components.decorators.DecoratorList;
import uk.org.ponder.rsf.components.decorators.UILabelTargetDecorator;
import uk.org.ponder.rsf.components.decorators.UITooltipDecorator;
import uk.org.ponder.rsf.evolvers.FormatAwareDateInputEvolver;
import uk.org.ponder.rsf.evolvers.TextInputEvolver;
import uk.org.ponder.rsf.flow.ARIResult;
import uk.org.ponder.rsf.flow.ActionResultInterceptor;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCase;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCaseReporter;
import uk.org.ponder.rsf.view.ComponentChecker;
import uk.org.ponder.rsf.view.ViewComponentProducer;
import uk.org.ponder.rsf.viewstate.SimpleViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParamsReporter;
public class AddPollProducer implements ViewComponentProducer,NavigationCaseReporter, ViewParamsReporter, ActionResultInterceptor {
public static final String VIEW_ID = "voteAdd";
private PollListManager pollListManager;
private MessageLocator messageLocator;
private static final Log LOG = LogFactory.getLog(AddPollProducer.class);
public String getViewID() {
return VIEW_ID;
}
public void setMessageLocator(MessageLocator messageLocator) {
this.messageLocator = messageLocator;
}
public void setPollListManager(PollListManager pollListManager) {
this.pollListManager = pollListManager;
}
private VoteBean voteBean;
public void setVoteBean(VoteBean vb){
this.voteBean = vb;
}
private TextInputEvolver richTextEvolver;
public void setRichTextEvolver(TextInputEvolver richTextEvolver) {
this.richTextEvolver = richTextEvolver;
}
private TargettedMessageList tml;
public void setTargettedMessageList(TargettedMessageList tml) {
this.tml = tml;
}
private ExternalLogic externalLogic;
public void setExternalLogic(ExternalLogic externalLogic) {
this.externalLogic = externalLogic;
}
private PollVoteManager pollVoteManager;
public void setPollVoteManager(PollVoteManager pvm){
this.pollVoteManager = pvm;
}
/*
* You can change the date input to accept time as well by uncommenting the lines like this:
* dateevolver.setStyle(FormatAwareDateInputEvolver.DATE_TIME_INPUT);
* and commenting out lines like this:
* dateevolver.setStyle(FormatAwareDateInputEvolver.DATE_INPUT);
* -AZ
*/
private FormatAwareDateInputEvolver dateevolver;
public void setDateEvolver(FormatAwareDateInputEvolver dateevolver) {
this.dateevolver = dateevolver;
}
public void fillComponents(UIContainer tofill, ViewParameters viewparams,
ComponentChecker checker) {
String currentuserid = externalLogic.getCurrentUserId();
PollViewParameters ecvp = (PollViewParameters) viewparams;
Poll poll = null;
boolean isNew = true;
UIForm newPoll = UIForm.make(tofill, "add-poll-form");
LOG.debug("Poll of id: " + ecvp.id);
if (ecvp.id == null || "New 0".equals(ecvp.id)) {
UIMessage.make(tofill,"new_poll_title","new_poll_title");
//build an empty poll
LOG.debug("this is a new poll");
poll = new Poll();
} else {
UIMessage.make(tofill,"new_poll_title","new_poll_title_edit");
String strId = ecvp.id;
LOG.debug("got id of " + strId);
poll = pollListManager.getPollById(Long.valueOf(strId));
voteBean.setPoll(poll);
newPoll.parameters.add(new UIELBinding("#{poll.pollId}",
poll.getPollId()));
isNew = false;
}
if (!externalLogic.isUserAdmin() && !externalLogic.isAllowedInLocation(PollListManager.PERMISSION_ADD, externalLogic.getCurrentLocationReference(),
externalLogic.getCurrentuserReference())) {
tml.addMessage(new TargettedMessage("new_poll_noperms"));
return;
}
//only display for exisiting polls
if (!isNew) {
//fill the options list
UIBranchContainer actionBlock = UIBranchContainer.make(newPoll, "option-headers:");
UIMessage.make(actionBlock,"options-title","new_poll_option_title");
UIInternalLink.make(actionBlock,"option-add",UIMessage.make("new_poll_option_add"),
new OptionViewParameters(PollOptionProducer.VIEW_ID, null, poll.getPollId().toString()));
List<Vote> votes = pollVoteManager.getAllVotesForPoll(poll);
if (votes != null && votes.size() > 0 ) {
LOG.debug("Poll has " + votes.size() + " votes");
UIBranchContainer errorRow = UIBranchContainer.make(tofill,"error-row:", "0");
UIMessage.make(errorRow,"error", "warn_poll_has_votes");
}
List<Option> options = pollListManager.getVisibleOptionsForPoll(poll.getPollId());
for (int i = 0; i < options.size(); i++){
Option o = (Option)options.get(i);
UIBranchContainer oRow = UIBranchContainer.make(actionBlock,"options-row:",o.getOptionId().toString());
UIVerbatim.make(oRow,"options-name",o.getOptionText());
UIInternalLink editOption = UIInternalLink.make(oRow,"option-edit",UIMessage.make("new_poll_option_edit"),
new OptionViewParameters(PollOptionProducer.VIEW_ID, o.getOptionId().toString()));
editOption.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("new_poll_option_edit") +":" + FormattedText.convertFormattedTextToPlaintext(o.getOptionText())));
UIInternalLink deleteOption = UIInternalLink.make(oRow,"option-delete",UIMessage.make("new_poll_option_delete"),
new OptionViewParameters(PollOptionDeleteProducer.VIEW_ID,o.getOptionId().toString()));
deleteOption.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("new_poll_option_delete") +":" + FormattedText.convertFormattedTextToPlaintext(o.getOptionText())));
}
}
UIMessage.make(tofill, "new-poll-descr", "new_poll_title");
UIMessage.make(tofill, "new-poll-question-label", "new_poll_question_label");
UIMessage pollDescr = UIMessage.make(tofill, "new-poll-descr-label", "new_poll_descr_label");
UIMessage.make(tofill, "new-poll-descr-label2", "new_poll_descr_label2");
//UIMessage.make(tofill, "new-poll-open-label", "new_poll_open_label");
//UIMessage.make(tofill, "new-poll-close-label", "new_poll_close_label");
UIMessage.make(tofill, "new-poll-limits", "new_poll_limits");
//UIMessage pollMin = UIMessage.make(tofill, "new-poll-min-limits", "new_poll_min_limits");
//UIMessage pollMax = UIMessage.make(tofill, "new-poll-max-limits", "new_poll_max_limits");
//the form fields
UIInput.make(newPoll, "new-poll-text", "#{poll.text}",poll.getText());
if (!externalLogic.isMobileBrowser())
{
// show WYSIWYG editor
UIInput itemDescr = UIInput.make(newPoll, "newpolldescr:", "#{poll.details}", poll.getDetails()); //$NON-NLS-1$ //$NON-NLS-2$
richTextEvolver.evolveTextInput(itemDescr);
UILabelTargetDecorator.targetLabel(pollDescr, itemDescr);
}
else
{
// do not show WYSIWYG editor in the mobile view
UIInput itemDescr = UIInput.make(newPoll, "newpolldescr_mobile", "#{poll.details}", poll.getDetails()); //$NON-NLS-1$ //$NON-NLS-2$
UILabelTargetDecorator.targetLabel(pollDescr, itemDescr);
}
UIInput voteOpen = UIInput.make(newPoll, "openDate:", "poll.voteOpen");
UIInput voteClose = UIInput.make(newPoll, "closeDate:", "poll.voteClose");
dateevolver.setStyle(FormatAwareDateInputEvolver.DATE_TIME_INPUT);
dateevolver.evolveDateInput(voteOpen, poll.getVoteOpen());
dateevolver.evolveDateInput(voteClose, poll.getVoteClose());
//UILabelTargetDecorator.targetLabel(pollOpen, voteOpen);
//UILabelTargetDecorator.targetLabel(pollClose, voteClose);
/*
* access options
*/
UIMessage.make(newPoll,"poll_access_label","new_poll_access_label");
UIBoundBoolean.make(newPoll, "access-public", "poll.isPublic", poll.getIsPublic());
String[] minVotes = new String[]{"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
String[] maxVotes = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
UISelect min = UISelect.make(newPoll,"min-votes",minVotes,"#{poll.minOptions}",Integer.toString(poll.getMinOptions()));
UISelect max = UISelect.make(newPoll,"max-votes",maxVotes,"#{poll.maxOptions}",Integer.toString(poll.getMaxOptions()));
/*
* open - can be viewd at any time
* never - not diplayed
* afterVoting - after user has voted
* afterClosing
*
*/
String[] values = new String[] { "open", "afterVoting", "afterClosing","never"};
String[] labels = new String[] {
messageLocator.getMessage("new_poll_open"),
messageLocator.getMessage("new_poll_aftervoting"),
messageLocator.getMessage("new_poll_afterClosing"),
messageLocator.getMessage("new_poll_never")
};
UISelect radioselect = UISelect.make(newPoll, "release-select", values,
"#{poll.displayResult}", poll.getDisplayResult());
radioselect.optionnames = UIOutputMany.make(labels);
String selectID = radioselect.getFullID();
//StringList optList = new StringList();
UIMessage.make(newPoll,"add_results_label","new_poll_results_label");
for (int i = 0; i < values.length; ++i) {
UIBranchContainer radiobranch = UIBranchContainer.make(newPoll,
"releaserow:", Integer.toString(i));
UISelectChoice choice = UISelectChoice.make(radiobranch, "release", selectID, i);
UISelectLabel lb = UISelectLabel.make(radiobranch, "releaseLabel", selectID, i);
UILabelTargetDecorator.targetLabel(lb, choice);
}
LOG.debug("About to close the form");
newPoll.parameters.add(new UIELBinding("#{poll.owner}",
currentuserid));
String siteId = externalLogic.getCurrentLocationId();
newPoll.parameters.add(new UIELBinding("#{poll.siteId}",siteId));
if (isNew || poll.getPollOptions() == null || poll.getPollOptions().size() == 0) {
UICommand.make(newPoll, "submit-new-poll", UIMessage.make("new_poll_saveoption"),
"#{pollToolBean.processActionAdd}");
} else {
UICommand.make(newPoll, "submit-new-poll", UIMessage.make("new_poll_submit"),
"#{pollToolBean.processActionAdd}");
}
UICommand cancel = UICommand.make(newPoll, "cancel",UIMessage.make("new_poll_cancel"),"#{pollToolBean.cancel}");
cancel.parameters.add(new UIELBinding("#{voteCollection.submissionStatus}", "cancel"));
LOG.debug("Finished generating view");
}
public List<NavigationCase> reportNavigationCases() {
List<NavigationCase> togo = new ArrayList<NavigationCase>(); // Always navigate back to this view.
togo.add(new NavigationCase(null, new SimpleViewParameters(VIEW_ID)));
togo.add(new NavigationCase("added", new SimpleViewParameters(PollToolProducer.VIEW_ID)));
togo.add(new NavigationCase("option", new OptionViewParameters(PollOptionProducer.VIEW_ID, null, null)));
togo.add(new NavigationCase("cancel", new SimpleViewParameters(PollToolProducer.VIEW_ID)));
return togo;
}
public ViewParameters getViewParameters() {
return new PollViewParameters();
}
public void interceptActionResult(ARIResult result, ViewParameters incoming, Object actionReturn) {
// OptionViewParameters outgoing = (OptionViewParameters) result.resultingView;
// SAK-14726 : Start BugFix
if (LOG.isDebugEnabled() && actionReturn != null) {
LOG.debug("actionReturn is of type " + actionReturn.getClass());
}
if (actionReturn == null) {
return;
}
Poll poll = null;
if(actionReturn instanceof org.sakaiproject.poll.model.Poll) {
poll = (Poll) actionReturn;
}
else {
PollViewParameters ecvp = (PollViewParameters) incoming;
if(null == ecvp || null == ecvp.id || "New 0".equals(ecvp.id)) {
return;
} else {
poll = pollListManager.getPollById(Long.valueOf(ecvp.id));
}
}
// SAK-14726 : End BugFix
if (poll == null) {
return;
}
LOG.debug("Action result got poll: " + poll.getPollId());
LOG.debug("resulting view is: " + result.resultingView);
if (poll.getPollOptions() == null || poll.getPollOptions().size() == 0) {
result.resultingView = new OptionViewParameters(PollOptionProducer.VIEW_ID, null, poll.getPollId().toString());
} else {
result.resultingView = new SimpleViewParameters(PollToolProducer.VIEW_ID);
}
//if (poll != null && outgoing.id == null) {
// outgoing.id = poll.getId().toString();
//}
}
}