git-svn-id: svn://svn.dsv.su.se/scipro/scipro/trunk@102 73ecded7-942e-4092-bab0-0e58ef0ee984
This commit is contained in:
dan-kjel 2011-02-11 08:10:54 +00:00
parent b01020c2ff
commit f43bc9b344
12 changed files with 668 additions and 0 deletions

@ -0,0 +1,93 @@
package se.su.dsv.scipro.schedule.forms;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import se.su.dsv.scipro.components.CustomDateTimeField;
import se.su.dsv.scipro.data.dao.interfaces.AjaxFromDialogUpdatingListPanel;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectEvent;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.schedule.models.ProjectEventModel;
public class ProjectEventForm extends Form<ProjectEventModel> {
private static final long serialVersionUID = 1L;
private WebMarkupContainer feedbackContainer;
private FeedbackPanel feedbackPanel;
public ProjectEventForm(String id, final ProjectEvent e, Project p, final AjaxFromDialogUpdatingListPanel<Event> parent, final boolean isEdit) {
super(id, new CompoundPropertyModel<ProjectEventModel>(new ProjectEventModel(e)));
feedbackContainer = new WebMarkupContainer("feedbackContainer");
feedbackContainer.setOutputMarkupId(true);
feedbackContainer.setVersioned(false);
feedbackPanel = new FeedbackPanel("feedbackPanel");
feedbackContainer.add(feedbackPanel);
add(feedbackContainer);
TextField<String> title = new TextField<String>("title");
title.setRequired(true);
add(title);
TextArea<String> description = new TextArea<String>("description");
add(description);
CustomDateTimeField dp = new CustomDateTimeField("date");
dp.setRequired(true);
add(dp);
List<Student> partList = new ArrayList<Student>(p.getProjectParticipants());
CheckBoxMultipleChoice<Student> checkBox = new CheckBoxMultipleChoice<Student>("participants", partList);
add(checkBox);
IndicatingAjaxButton saveButton = new IndicatingAjaxButton("saveButton", new Model<String>("Save"), this){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
ProjectEventModel model = (ProjectEventModel) form.getModelObject();
if(model.getDate().before(new Date())){
error("Please provide a date in the future");
invalid();
target.addComponent(feedbackContainer);
} else {
List<Event> eventList = parent.getListView().getModelObject();
if(isEdit){
eventList.remove(e);
}
eventList.add(model.persist());
Collections.sort(eventList);
parent.getListContainer().replace(parent.getListView());
target.addComponent(parent.getListContainer());
target.appendJavascript( parent.getDialog().close().render(true).toString() );
}
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.addComponent(feedbackContainer);
}
};
saveButton.add(new AttributeModifier("class", new Model<String>("ui-button")));
add(saveButton);
}
}

@ -0,0 +1,84 @@
package se.su.dsv.scipro.schedule.models;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
import org.apache.wicket.IClusterable;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.ProjectEventDao;
import se.su.dsv.scipro.data.dataobjects.ProjectEvent;
import se.su.dsv.scipro.data.dataobjects.Student;
public class ProjectEventModel implements IClusterable {
private static final long serialVersionUID = 1L;
@SpringBean
private ProjectEventDao peDao;
private ProjectEvent event;
private String title;
private String description;
private Date date;
private List<Student> participants;
public ProjectEventModel(ProjectEvent event) {
this.event = event;
if(event.getDueDate() == null){
event.setDueDate(new Date());
}
setTitle(event.getTitle());
setDescription(event.getDescription());
if(event.getParticipants() != null){
setParticipants(new ArrayList<Student>(event.getParticipants()));
}
setDate(event.getDueDate());
InjectorHolder.getInjector().inject(this);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public List<Student> getParticipants() {
return participants;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public void setParticipants(List<Student> participants) {
this.participants = participants;
}
public ProjectEvent persist(){
event.setTitle(title);
event.setDescription(description);
event.setDueDate(date);
event.setParticipants(new TreeSet<Student>(participants));
return peDao.save(event);
}
}

@ -0,0 +1,24 @@
<html>
<body>
<wicket:extend>
<h3>Schedule Planner</h3>
<div>
<ul>
<li wicket:id="projectList" style="list-style-type: none;">
<a href="#" wicket:id="schedulePlannerLink">
<span wicket:id="projectTitle">Link to project schedule here</span>
</a>
</li>
</ul>
</div>
<div class="dashboardBox">
<h3>Project events</h3>
<div wicket:id="spContainer" style="display:none">
<div wicket:id="schedulePlannerPanel"></div>
</div>
</div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,88 @@
package se.su.dsv.scipro.schedule.pages;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.core.effects.EffectSpeed;
import org.odlabs.wiquery.core.effects.fading.FadeIn;
import org.odlabs.wiquery.core.javascript.JsStatement;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.basepages.PublicPage;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.enums.ProjectStatus;
import se.su.dsv.scipro.schedule.panels.SchedulePlannerPanel;
public class SchedulePage extends PublicPage {
@SpringBean
private ProjectDao projectDao;
private User user;
private WebMarkupContainer spContainer;
public SchedulePage(){
super();
setup();
}
public SchedulePage(final PageParameters pp){
super(pp);
setup();
}
public void setup(){
user = SciProSession.get().getUser();
System.out.println(user.getFirstName());
List<Project> projects = projectDao.getProjectsByParticipant(user, ProjectStatus.ACTIVE);
for(Project p : projects)
System.out.println(p.getTitle());
spContainer = new WebMarkupContainer("spContainer");
spContainer.setOutputMarkupId(true);
spContainer.setVersioned(false);
spContainer.add(new EmptyPanel("schedulePlannerPanel"));
add(spContainer);
ListView<Project> projectList = new ListView<Project>("projectList", projects){
private static final long serialVersionUID = 1L;
protected void populateItem(ListItem<Project> item) {
final Project p = item.getModelObject();
IndicatingAjaxLink<Void> schedulePlannerLink = new IndicatingAjaxLink<Void>("schedulePlannerLink"){
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
SchedulePlannerPanel sp = new SchedulePlannerPanel("schedulePlannerPanel", p, user);
spContainer.replace(sp);
target.addComponent(spContainer);
target.appendJavascript(new StringBuffer(new JsStatement().$(spContainer).chain(new FadeIn(EffectSpeed.FAST)).render(true)).toString());
}
};
schedulePlannerLink.add(new Label("projectTitle", p.getTitle()));
item.add(schedulePlannerLink);
}
};
add(projectList);
}
}

@ -0,0 +1,23 @@
<html>
<body>
<wicket:panel>
<form wicket:id="eventForm">
<div wicket:id="feedbackContainer">
<div wicket:id="feedbackPanel"></div>
</div>
<p>Title:</p>
<input type="text" wicket:id="title" />
<p>Description:</p>
<textarea wicket:id="description"></textarea>
<p>Date:</p>
<div wicket:id="date"></div>
<p>Select participant(s):</p>
<span wicket:id="participants">
<input type="checkbox" />
</span>
<br />
<input type="submit" wicket:id="saveButton" />
</form>
</wicket:panel>
</body>
</html>

@ -0,0 +1,25 @@
package se.su.dsv.scipro.schedule.panels;
import org.apache.wicket.markup.html.panel.Panel;
import se.su.dsv.scipro.data.dao.interfaces.AjaxFromDialogUpdatingListPanel;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectEvent;
import se.su.dsv.scipro.schedule.forms.ProjectEventForm;
public class CreateProjectEventPanel extends Panel {
private static final long serialVersionUID = 1L;
public CreateProjectEventPanel(String id, Project p, ProjectEvent e, AjaxFromDialogUpdatingListPanel<Event> parent){
super(id);
boolean isEdit = true;
if(e == null){
e = new ProjectEvent();
e.setProjectSchedule(p.getProjectSchedule());
isEdit = false;
}
add(new ProjectEventForm("eventForm", e, p, parent, isEdit));
}
}

@ -0,0 +1,16 @@
<html>
<body>
<wicket:panel>
<div class="scheduleEventHeader">
<span wicket:id="eventTitle">Event title here</span>
<a href="#" wicket:id="eventDeleteLink">Delete</a>
</div>
<div class="scheduleEventContent">
<span>Due date: <span wicket:id="eventDueDate"></span></span>
<div class="scheduleEventParticipants" wicket:id="eventParticipants">
<span wicket:id="participant" class="project">Event participant here</span>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,54 @@
package se.su.dsv.scipro.schedule.panels;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.AjaxFromDialogUpdatingListPanel;
import se.su.dsv.scipro.data.dao.interfaces.EventDao;
import se.su.dsv.scipro.data.dao.interfaces.EventParticipant;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.GroupEvent;
public class GroupEventPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean
private EventDao eventDao;
public GroupEventPanel(String id, final GroupEvent e, final AjaxFromDialogUpdatingListPanel<Event> parent){
super(id);
add(new Label("eventTitle", e.getTitle()));
add(new AjaxLink<Void>("eventDeleteLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
eventDao.lazyDelete(e);
parent.getListView().getModelObject().remove(e);
target.addComponent(parent.getListContainer());
}
});
add(new Label("eventDueDate", e.getDueDate().toString()));
add(new ListView<EventParticipant>("eventParticipants", e.getEventParticipants()){
private static final long serialVersionUID = 1L;
@Override
public void populateItem(ListItem<EventParticipant> item){
item.add(new Label("participant", item.getModelObject().getEventParticipantAsString()));
add(item);
}
});
}
}

@ -0,0 +1,17 @@
<html>
<body>
<wicket:panel>
<div class="scheduleEventHeader">
<span wicket:id="eventTitle">Event title here</span>
<a href="#" wicket:id="eventEditLink">Edit</a>
<a href="#" wicket:id="eventDeleteLink">Delete</a>
</div>
<div class="scheduleEventContent">
<span>Date: <span wicket:id="eventDueDate"></span></span>
<div class="scheduleEventParticipants" wicket:id="eventParticipants">
<span wicket:id="participant" class="user">Event participant here</span>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,72 @@
package se.su.dsv.scipro.schedule.panels;
import java.util.Iterator;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.AjaxFromDialogUpdatingListPanel;
import se.su.dsv.scipro.data.dao.interfaces.EventDao;
import se.su.dsv.scipro.data.dao.interfaces.EventParticipant;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.ProjectEvent;
public class ProjectEventPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean
private EventDao eventDao;
private ProjectEvent event;
public ProjectEventPanel(String id, final ProjectEvent e, final AjaxFromDialogUpdatingListPanel<Event> parent){
super(id);
this.event = e;
add(new Label("eventTitle", e.getTitle()));
add(new AjaxLink<Void>("eventEditLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
parent.getDialogContainer().replace(new CreateProjectEventPanel("containerContent", e.getProjectSchedule().getProject(), e, parent));
target.addComponent(parent.getDialogContainer());
parent.getDialog().setTitle("Edit event");
parent.getDialog().open(target);
}
});
add(new AjaxLink<Void>("eventDeleteLink"){
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
eventDao.lazyDelete(event);
parent.getListView().getModelObject().remove(event);
target.addComponent(parent.getListContainer());
}
});
add(new Label("eventDueDate", e.getDueDate().toString()));
add(new ListView<EventParticipant>("eventParticipants", e.getEventParticipants()){
private static final long serialVersionUID = 1L;
@Override
public void populateItem(ListItem<EventParticipant> item){
item.add(new Label("participant", item.getModelObject().getEventParticipantAsString()));
add(item);
}
});
}
}

@ -0,0 +1,26 @@
<html>
<body>
<wicket:panel>
<div class="boxContent">
<h4 wicket:id="selectedProject">Selected project title here</h4>
<a href="#" wicket:id="addCustomEventLink">Add custom event</a>
<a href="#" wicket:id="addEventFromTemplateLink">Add event from template</a>
<a href="#" wicket:id="createScheduleFromTemplateLink">Create schedule from template</a>
<div wicket:id="dialog">
<div wicket:id="dialogContainer">
<div wicket:id="containerContent">
</div>
</div>
</div>
<div class="scheduleEventList" wicket:id="eventListContainer" id="eventListContainer" >
<wicket:container wicket:id="events">
<div wicket:id="eventPanel"></div>
</wicket:container>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,146 @@
package se.su.dsv.scipro.schedule.panels;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.data.dao.interfaces.AjaxFromDialogUpdatingListPanel;
import se.su.dsv.scipro.data.dao.interfaces.EventDao;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
public class SchedulePlannerPanel extends Panel implements AjaxFromDialogUpdatingListPanel<Event> {
private static final long serialVersionUID = 1L;
@SpringBean
private EventDao eventDao;
private Project project;
private User user;
private WebMarkupContainer dialogContainer;
private Dialog dialog;
private ListView<Event> eventList;
private WebMarkupContainer eventListContainer;
public SchedulePlannerPanel(String id, Project project, User user) {
super(id);
this.project = project;
this.user = user;
setup();
}
public void setup(){
final ListModel<Event> eventsModel = new ListModel<Event>(eventDao.getAllEventsByUserAndProject(user, project));
eventListContainer = new WebMarkupContainer("eventListContainer");
eventListContainer.setOutputMarkupId(true);
eventList = new ListView<Event>("events", eventsModel){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Event> item) {
final Event e = item.getModelObject();
item.add(e.getSchedulePanel("eventPanel", SchedulePlannerPanel.this));
add(item);
}
};
eventList.setOutputMarkupId(true);
eventListContainer.add(eventList);
add(eventListContainer);
add(new Label("selectedProject", project.getTitle()));
dialogContainer = new WebMarkupContainer("dialogContainer");
dialogContainer.setOutputMarkupId(true);
dialogContainer.setVersioned(false);
dialogContainer.add(new EmptyPanel("containerContent"));
dialog = new Dialog("dialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
dialog.add(dialogContainer);
dialog.setWidth(600);
add(dialog);
AjaxLink<Void> addCustomEventLink = new AjaxLink<Void>("addCustomEventLink"){
/**
*
*/
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
dialogContainer.replace(new CreateProjectEventPanel("containerContent", project, null, SchedulePlannerPanel.this));
target.addComponent(dialogContainer);
dialog.setTitle("Add custom event");
dialog.open(target);
}
};
add(addCustomEventLink);
AjaxLink<Void> addEventFromTemplateLink = new AjaxLink<Void>("addEventFromTemplateLink"){
/**
*
*/
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget arg0) {
return;
}
};
add(addEventFromTemplateLink);
AjaxLink<Void> createScheduleFromTemplateLink = new AjaxLink<Void>("createScheduleFromTemplateLink"){
/**
*
*/
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget arg0) {
return;
}
public boolean isVisible(){
return project.getProjectSchedule() == null;
}
};
add(createScheduleFromTemplateLink);
}
public Dialog getDialog(){
return dialog;
}
public ListView<Event> getListView(){
return eventList;
}
public WebMarkupContainer getListContainer(){
return eventListContainer;
}
public WebMarkupContainer getDialogContainer(){
return dialogContainer;
}
public void removeObjectFromModel(Event object) {
eventList.getModelObject().remove(object);
}
}