package org.sakaiproject.tool.gradebook.ui.helpers.producers;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.sakaiproject.service.gradebook.shared.GradebookService;
import org.sakaiproject.tool.gradebook.Assignment;
import org.sakaiproject.tool.gradebook.Category;
import org.sakaiproject.tool.gradebook.Gradebook;
import org.sakaiproject.tool.gradebook.business.GradebookManager;
import org.sakaiproject.tool.gradebook.ui.helpers.beans.GradebookItemBean;
import org.sakaiproject.tool.gradebook.ui.helpers.params.GradebookItemViewParams;
import uk.org.ponder.beanutil.entity.EntityBeanLocator;
import uk.org.ponder.messageutil.MessageLocator;
import uk.org.ponder.rsf.components.UIBoundBoolean;
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.UIMessage;
import uk.org.ponder.rsf.components.UIOutput;
import uk.org.ponder.rsf.components.UISelect;
import uk.org.ponder.rsf.components.UIVerbatim;
import uk.org.ponder.rsf.components.decorators.DecoratorList;
import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator;
import uk.org.ponder.rsf.evolvers.FormatAwareDateInputEvolver;
import uk.org.ponder.rsf.flow.ARIResult;
import uk.org.ponder.rsf.flow.ActionResultInterceptor;
import uk.org.ponder.rsf.util.RSFUtil;
import uk.org.ponder.rsf.view.ComponentChecker;
import uk.org.ponder.rsf.view.DefaultView;
import uk.org.ponder.rsf.view.ViewComponentProducer;
import uk.org.ponder.rsf.viewstate.RawViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParamsReporter;
public class GradebookItemProducer implements ActionResultInterceptor,
ViewComponentProducer, ViewParamsReporter, DefaultView {
public static final String VIEW_ID = "gradebookItem";
public String getViewID() {
return VIEW_ID;
}
private String reqStar = "<span class=\"reqStar\">*</span>";
public ViewParameters getViewParameters() {
return new GradebookItemViewParams();
}
private EntityBeanLocator assignmentBeanLocator;
public void setAssignmentBeanLocator(EntityBeanLocator assignmentBeanLocator) {
this.assignmentBeanLocator = assignmentBeanLocator;
}
private MessageLocator messageLocator;
public void setMessageLocator(MessageLocator messageLocator) {
this.messageLocator = messageLocator;
}
private GradebookManager gradebookManager;
public void setGradebookManager(GradebookManager gradebookManager) {
this.gradebookManager = gradebookManager;
}
private GradebookService gradebookService;
public void setGradebookService(GradebookService gradebookService) {
this.gradebookService = gradebookService;
}
/*
* 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
* And vice versa - RWE
*/
private FormatAwareDateInputEvolver dateEvolver;
public void setDateEvolver(FormatAwareDateInputEvolver dateEvolver) {
this.dateEvolver = dateEvolver;
}
public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) {
GradebookItemViewParams params = (GradebookItemViewParams) viewparams;
if (params.contextId == null) {
//TODO do something
return;
}
if (!gradebookService.currentUserHasEditPerm(params.contextId)) {
UIMessage.make(tofill, "permissions_error", "gradebook.authorizationFailed.permissions_error");
return;
}
//Gradebook Info
Gradebook gradebook = gradebookManager.getGradebook(params.contextId);
Long gradebookId = gradebook.getId();
List<Category> categories = gradebookManager.getCategories(gradebookId);
String newItemName = params.name;
String newItemDueTime = params.dueDateTime;
Date newItemDueDate = null;
if (newItemDueTime != null && !"".equals(newItemDueTime.trim())) {
try {
Long time = Long.parseLong(newItemDueTime);
newItemDueDate = new Date(time.longValue());
} catch (NumberFormatException nfe) {
// something funky was passed here, so we won't try to pre-set the due date
}
}
//OTP
String assignmentOTP = "Assignment.";
String OTPKey = "";
if (params.assignmentId != null) {
OTPKey += params.assignmentId.toString();
} else {
OTPKey += EntityBeanLocator.NEW_PREFIX + "1";
}
assignmentOTP += OTPKey;
Boolean add = (params.assignmentId == null);
//set dateEvolver
dateEvolver.setStyle(FormatAwareDateInputEvolver.DATE_INPUT);
//Display None Decorator list
Map<String, String> attrmap = new HashMap<String, String>();
attrmap.put("style", "display:none");
DecoratorList display_none_list = new DecoratorList(new UIFreeAttributeDecorator(attrmap));
//Setting up Dates
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 7);
cal.set(Calendar.HOUR_OF_DAY, 17);
cal.set(Calendar.MINUTE, 0);
Date duedate = cal.getTime();
if (add){
UIMessage.make(tofill, "heading", "gradebook.add-gradebook-item.heading_add");
} else {
UIMessage.make(tofill, "heading", "gradebook.add-gradebook-item.heading_edit");
}
UIVerbatim.make(tofill, "instructions", messageLocator.getMessage("gradebook.add-gradebook-item.instructions",
new Object[]{ reqStar }));
//Start Form
UIForm form = UIForm.make(tofill, "form");
UIVerbatim.make(form, "title_label", messageLocator.getMessage("gradebook.add-gradebook-item.title_label",
new Object[]{ reqStar }));
// if this is a new gradebook item, use the name parameter passed via the url
if (add) {
// add the name first as a UIELBinding to force it to save this value
// if the user doesn't update the name field
form.parameters.add( new UIELBinding(assignmentOTP + ".name", newItemName));
UIInput.make(form, "title", assignmentOTP + ".name", newItemName);
} else {
UIInput.make(form, "title", assignmentOTP + ".name");
}
if (gradebook.getGrade_type() == GradebookService.GRADE_TYPE_POINTS) {
UIVerbatim.make(form, "point_label", messageLocator.getMessage("gradebook.add-gradebook-item.point_label",
new Object[]{ reqStar }));
} else {
UIVerbatim.make(form, "point_label", messageLocator.getMessage("gradebook.add-gradebook-item.percentage_label",
new Object[]{ reqStar }));
}
UIInput.make(form, "point", assignmentOTP + ".pointsPossible");
Assignment assignment = (Assignment) assignmentBeanLocator.locateBean(OTPKey);
if (add) {
// if a due date was passed in, set the due date
if (newItemDueDate != null) {
assignment.setDueDate(newItemDueDate);
}
}
UIBoundBoolean.make(form, "extraCredit", assignmentOTP + ".extraCredit");
UIMessage.make(form, "extraCredit_label", "gradebook.add-gradebook-item.extra_credit");
Boolean require_due_date = (assignment.getDueDate() != null);
UIBoundBoolean.make(form, "require_due_date", "#{GradebookItemBean.requireDueDate}", require_due_date);
UIMessage.make(form, "require_due_date_label", "gradebook.add-gradebook-item.require_due_date");
UIOutput require_due_container = UIOutput.make(form, "require_due_date_container");
UIInput dueDateField = UIInput.make(form, "due_date:", assignmentOTP + ".dueDate");
Date initDueDate = assignment.getDueDate() != null ? assignment.getDueDate() : duedate;
dateEvolver.evolveDateInput(dueDateField, initDueDate);
// add the due date as a UIELBinding to force it to save this value
// if the user doesn't update the due date field
form.parameters.add( new UIELBinding(assignmentOTP + ".dueDate", initDueDate));
form.parameters.add( new UIELBinding("#{GradebookItemBean.requireDueDate}", require_due_date));
if (!require_due_date){
require_due_container.decorators = display_none_list;
}
if (categories.size() > 0){
UIOutput.make(form, "category_li");
String[] category_labels = new String[categories.size() + 1];
String[] category_values = new String[categories.size() + 1];
category_labels[0] = messageLocator.getMessage("gradebook.add-gradebook-item.category_unassigned");
category_values[0] = GradebookItemBean.CATEGORY_UNASSIGNED.toString();
int i=1;
for (Category cat : categories){
category_labels[i] = cat.getName();
category_values[i] = cat.getId().toString();
i++;
}
String categoryId = GradebookItemBean.CATEGORY_UNASSIGNED.toString(); // unassigned by default
if (assignment.getCategory() != null) {
categoryId = assignment.getCategory().getId().toString();
}
UISelect.make(form, "category", category_values, category_labels, "#{GradebookItemBean.categoryId}", categoryId);
if (gradebook.getCategory_type() == GradebookService.CATEGORY_TYPE_WEIGHTED_CATEGORY) {
UIOutput.make(form, "category_instruction", messageLocator.getMessage("gradebook.add-gradebook-item.cateogry_instruction"));
}
}
UIBoundBoolean.make(form, "release", assignmentOTP + ".released", assignment.isReleased());
UIBoundBoolean.make(form, "course_grade", assignmentOTP + ".counted", assignment.isCounted());
form.parameters.add( new UIELBinding("#{GradebookItemBean.gradebookId}", gradebookId));
//RSFUtil.addResultingViewBinding(form, "assignmentId", assignmentOTP + ".id");
RSFUtil.addResultingViewBinding(form, "name", assignmentOTP + ".name");
RSFUtil.addResultingViewBinding(form, "requireDueDate", "#{GradebookItemBean.requireDueDate}");
RSFUtil.addResultingViewBinding(form, "dueDate", assignmentOTP + ".dueDate");
//Action Buttons
if (add){
UICommand.make(form, "add_item", UIMessage.make("gradebook.add-gradebook-item.add_item"), "#{GradebookItemBean.processActionAddItem}");
} else {
UICommand.make(form, "add_item", UIMessage.make("gradebook.add-gradebook-item.edit_item"), "#{GradebookItemBean.processActionAddItem}");
}
UICommand.make(form, "cancel", UIMessage.make("gradebook.add-gradebook-item.cancel"), "#{GradebookItemBean.processActionCancel}");
}
public void interceptActionResult(ARIResult result,
ViewParameters incoming, Object actionReturn) {
if (incoming instanceof GradebookItemViewParams) {
GradebookItemViewParams params = (GradebookItemViewParams) incoming;
if (params.finishURL != null && actionReturn.equals("cancel")) {
result.resultingView = new RawViewParameters(params.finishURL);
}
else if (params.finishURL != null && actionReturn.equals("submit")) {
//tack on name and due date of newly created item
String name = ((GradebookItemViewParams)result.resultingView).name;
String gbItemDueTime = "";
boolean requireDueDate = ((GradebookItemViewParams)result.resultingView).requireDueDate;
if (requireDueDate) {
Date dueDate = ((GradebookItemViewParams)result.resultingView).dueDate;
if (dueDate != null) {
gbItemDueTime = dueDate.getTime() + "";
}
}
result.resultingView = new RawViewParameters(params.finishURL + "?gbItemName=" + name + "&gbItemDueTime=" + gbItemDueTime);
}
}
}
}