Schematemplates

git-svn-id: svn://svn.dsv.su.se/scipro/scipro/trunk@331 73ecded7-942e-4092-bab0-0e58ef0ee984
This commit is contained in:
dan-kjel 2011-03-14 13:18:32 +00:00
parent 9218f6ffd5
commit e8d6a10592
16 changed files with 1116 additions and 0 deletions

@ -0,0 +1,4 @@
<wicket:extend>
<h3>Schedule template details</h3>
<div wicket:id="scheduleTemplateDetailsPanel"></div>
</wicket:extend>

@ -0,0 +1,31 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.basepages.PublicPage;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateDetailsPanel;
public class ScheduleTemplateDetailsPage extends PublicPage {
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateDetailsPage(final PageParameters pp){
Long id = pp.getAsLong("id");
if(id == null){
//TODO: 404
}
ScheduleTemplate s = scheduleTemplateDao.load(id);
if(s == null){
//404
}
add(new ScheduleTemplateDetailsPanel("scheduleTemplateDetailsPanel", s));
}
}

@ -0,0 +1,8 @@
<html>
<body>
<wicket:extend>
<h3>Schedule Template Editor</h3>
<div wicket:id="scheduleTemplateFormPanel"></div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,33 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.SciProApplication;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.basepages.PublicPage;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateFormPanel;
public class ScheduleTemplateEditorPage extends PublicPage {
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateEditorPage(final PageParameters pp, Long id){
super(pp);
ScheduleTemplate st = null;
if(id != null){
st = scheduleTemplateDao.load(id);
}
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", st, id != null));
}
public ScheduleTemplateEditorPage(final PageParameters pp){
this(pp, null);
}
}

@ -0,0 +1,7 @@
<html>
<body>
<wicket:extend>
<div wicket:id="scheduleTemplatePanel"></div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,18 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import se.su.dsv.scipro.basepages.PublicPage;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplatePanel;
public class ScheduleTemplatePage extends PublicPage {
public ScheduleTemplatePage(final PageParameters pp){
super(pp);
setVersioned(false);
add(new ScheduleTemplatePanel("scheduleTemplatePanel", false));
}
}

@ -0,0 +1,23 @@
<wicket:panel>
<form wicket:id="eventTemplateForm">
<div wicket:id="eventTemplateFeedbackContainer">
<div wicket:id="eventTemplateFeedback"></div>
</div>
<div class="formRow">
<label for="eventTemplateTitle">Title:</label>
<input type="text" wicket:id="title" name="eventTemplateTitle" />
</div>
<div class="formRow">
<label for="eventTemplateDescription">Description:</label>
<textarea wicket:id="description" name="eventTemplateDescription"></textarea>
</div>
<div class="formRow">
<label for="estimatedTimeConsumption">Estimated time consumtion:</label>
<input type="text" wicket:id="estimatedTimeConsumption" name="estimatedTimeConsumption" />
</div>
<div class="formRow">
<input type="submit" wicket:id="addEventTemplateButton" />
<input type="submit" wicket:id="cancelEventTemplateButton" />
</div>
</form>
</wicket:panel>

@ -0,0 +1,95 @@
package se.su.dsv.scipro.schedule.templates.panels;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
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.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import se.su.dsv.scipro.components.FormFeedbackPanel;
import se.su.dsv.scipro.data.dataobjects.EventTemplate;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
public class EventTemplateFormPanel extends Panel {
private static final long serialVersionUID = 1L;
private EventTemplate eventTemplate;
private ScheduleTemplate owner;
private boolean isEdit;
public EventTemplateFormPanel(String id, EventTemplate eventTemplate, ScheduleTemplate owner, boolean isEdit){
super(id);
this.eventTemplate = eventTemplate;
this.owner = owner;
this.isEdit = isEdit;
add(new EventTemplateForm("eventTemplateForm"));
}
protected void onEventTemplateAdded(AjaxRequestTarget target){
}
protected void onEventTemplatedCanceled(AjaxRequestTarget target){
}
class EventTemplateForm extends Form<EventTemplate> {
private static final long serialVersionUID = 1L;
private FormFeedbackPanel<EventTemplate> eventTemplateFeedbackPanel;
private WebMarkupContainer eventTemplateFeedbackContainer;
public EventTemplateForm(String id) {
super(id, new CompoundPropertyModel<EventTemplate>(eventTemplate));
eventTemplateFeedbackContainer = new WebMarkupContainer("eventTemplateFeedbackContainer");
eventTemplateFeedbackContainer.setOutputMarkupId(true);
eventTemplateFeedbackPanel = new FormFeedbackPanel<EventTemplate>("eventTemplateFeedback", this);
eventTemplateFeedbackContainer.add(eventTemplateFeedbackPanel);
add(eventTemplateFeedbackContainer);
add(new TextField<String>("title").setRequired(true));
add(new TextArea<String>("description"));
add(new TextField<Long>("estimatedTimeConsumption"));
add(new AjaxButton("addEventTemplateButton", new Model<String>(isEdit ? "Done" : "Add")){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target,
Form<?> form) {
EventTemplate eTemplate = (EventTemplate) form.getModelObject();
if(!isEdit){
eTemplate.setNumberInOrder(owner.getEventTemplates().size());
owner.addEventTemplate(eTemplate);
}
EventTemplateFormPanel.this.onEventTemplateAdded(target);
}
@Override
public void onError(AjaxRequestTarget target, Form<?> form){
target.addComponent(eventTemplateFeedbackContainer);
}
});
add(new AjaxButton("cancelEventTemplateButton", new Model<String>("Cancel")){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
EventTemplateFormPanel.this.onEventTemplatedCanceled(target);
}
}.setDefaultFormProcessing(false));
}
}
}

@ -0,0 +1,62 @@
<html>
<body>
<wicket:panel>
<div style="">
<h4 wicket:id="templateName">Tempalte name</h4>
<span wicket:id="templateDescription">Template description</span>
<table>
<tr>
<td>Number of events:</td>
<td><span wicket:id="numEventTemplates">Number of events</span></td>
</tr>
<tr>
<td>Total estimated time:</td>
<td><span wicket:id="totalEstimatedTime">Total time</span></td>
</tr>
<tr>
<td>Creator:</td>
<td><span wicket:id="templateCreator">Creator</span></td>
</tr>
<tr>
<td>Date created:</td>
<td><span wicket:id="templateCreated"></span></td>
</tr>
<tr>
<td>Last updated:</td>
<td><span wicket:id="templateUpdated"></span></td>
</tr>
<tr>
<td>System template:</td>
<td><span wicket:id="isSysAdminTemplate"></span></td>
</tr>
<tr>
<td>Active:</td>
<td><span wicket:id="templateActive"></span></td>
</tr>
<tr>
<td>Direct link:</td>
<td><a href="#" wicket:id="directLink">link</a></td>
</tr>
</table>
<h4>Events</h4>
<div wicket:id="eventList">
<div style="border:1px solid black; margin: 0.5em 0;">
<div>
<span wicket:id="etTitle">Event title</span>
</div>
<div>
<span wicket:id="etDescription">Event description</span>
</div>
<div>
<span>Estimated time: </span><span wicket:id="etTimeConsumption">Time consumption</span>
</div>
<div>
<span>For debug number in order: </span><span wicket:id="etNumberInOrder">Number in order</span>
</div>
</div>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,87 @@
package se.su.dsv.scipro.schedule.templates.panels;
import java.util.Date;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
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.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.components.ExpandableMultiLineLabel;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.EventTemplate;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplateDetailsPage;
public class ScheduleTemplateDetailsPanel extends Panel {
private static final long serialVersionUID = 1L;
private ScheduleTemplate template;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateDetailsPanel(String id, final ScheduleTemplate st){
super(id);
template = scheduleTemplateDao.reLoad(st);
add(new Label("templateName", template.getTemplateName()));
add(new ExpandableMultiLineLabel("templateDescription", 100, template.getTemplateDescription() != null ?
template.getTemplateDescription() : "", false));
List<EventTemplate> etList = template.getEventTemplates();
add(new Label("numEventTemplates", etList.size() + ""));
long totalEstimatedTime = 0;
for(EventTemplate et : etList){
totalEstimatedTime += et.getEstimatedTimeConsumption();
}
add(new Label("totalEstimatedTime", totalEstimatedTime + ""));
add(template.getCreator().getWebLabel("templateCreator"));
final PatternDateConverter pc = new PatternDateConverter("yyyy-MM-dd hh-mm", false);
add(new DateLabel("templateCreated", new Model<Date>(template.getDateCreated()), pc));
add(new DateLabel("templateUpdated", new Model<Date>(template.getLastModified()), pc));
Label isSysAdminTemplateLabel = new Label("isSysAdminTemplate", "");
isSysAdminTemplateLabel.add(new AttributeAppender("class", new Model<String>("icon " + (template.isSysAdminTemplate() ? "icon-check" : "icon-delete")), " "));
add(isSysAdminTemplateLabel);
Label active = new Label("templateActive", "");
active.add(new AttributeAppender("class", new Model<String>("icon " + (template.isActive() ? "icon-check" : "icon-delete")), " "));
add(active);
final PageParameters pp = new PageParameters();
pp.put("id", template.getId());
BookmarkablePageLink<ScheduleTemplateDetailsPage> directLink = new BookmarkablePageLink<ScheduleTemplateDetailsPage>("directLink", ScheduleTemplateDetailsPage.class, pp);
add(directLink);
add(new ListView<EventTemplate>("eventList", etList){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<EventTemplate> item) {
EventTemplate et = item.getModelObject();
item.setOutputMarkupId(true);
item.add(new Label("etTitle", et.getTitle()));
item.add(new ExpandableMultiLineLabel("etDescription", 100, et.getDescription() != null ? et.getDescription() : "", false));
item.add(new Label("etTimeConsumption", et.getEstimatedTimeConsumption() + ""));
item.add(new Label("etNumberInOrder", et.getNumberInOrder() + ""));
add(item);
}
});
}
}

@ -0,0 +1,55 @@
<wicket:panel>
<form wicket:id="templateForm">
<div wicket:id="feedbackContainer">
<div wicket:id="feedbackPanel"></div>
</div>
<div class="float-left" style="width: 20em;">
<h5>General</h5>
<div class="formRow">
<label for="templateName">Name:</label>
<input type="text" wicket:id="templateName" name="templateName" />
</div>
<div class="formRow">
<label for="templateDescription">Description:</label>
<textarea wicket:id="templateDescription" name="templateDescription"></textarea>
</div>
<div class="formRow">
<label for="active">Active:</label>
<input type="checkbox" wicket:id="active" name="active" />
</div>
<div class="formRow">
<span>Days total: </span><span wicket:id="totalEstimatedTime">Number of days</span>
</div>
<div class="formRow">
<input type="submit" wicket:id="saveButton" />
<input type="submit" wicket:id="cancelButton" />
</div>
</div>
<div class="float-left" style="width: 30em; margin-left: 2em;">
<h5>Events</h5>
<div class="formRow">
<span wicket:id="addEventTemplate" class="icon icon-button icon-plus"></span><span>Add event template to schedule</span>
<div wicket:id="addEventTemplateContainer" style="display:none;">
<div wicket:id="addEventTemplateFormPanel"></div>
</div>
</div>
<div wicket:id="eventTemplateListContainer">
<div wicket:id="eventTemplates" class="connectedSortable" style="border: 1px solid black; margin: 5px 5px; padding: 0.3em;background-color:#B3D1FF;">
<div style="border-bottom: 1px dashed black; margin: 2px 3px;">
<span wicket:id="eventTemplateTitle">Event template title</span>
<span wicket:id="deleteEventTemplateIcon" class="icon icon-button icon-delete floating-icon float-right"></span>
<span wicket:id="editEventTemplateIcon" class="icon icon-button icon-pencil floating-icon float-right"></span>
</div>
<div>
<span>Estimated time:</span><span wicket:id="eventTemplateTimeConsumption">Event template time consumption</span>
</div>
<div wicket:id="editEventTemplateContainer">
<div wicket:id="eventTemplateFormContainer">
<div wicket:id="editEventTemplateFormPanel"></div>
</div>
</div>
</div>
</div>
</div>
</form>
</wicket:panel>

@ -0,0 +1,291 @@
package se.su.dsv.scipro.schedule.templates.panels;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
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.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.core.effects.EffectSpeed;
import org.odlabs.wiquery.ui.sortable.SortableAjaxBehavior;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.FormFeedbackPanel;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.EventTemplate;
import se.su.dsv.scipro.data.dataobjects.ProjectEventTemplate;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatePage;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
public class ScheduleTemplateFormPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateFormPanel(String id, ScheduleTemplate template, boolean isSysAdminView) {
super(id);
if(template == null){
template = new ScheduleTemplate();
template.setCreator(SciProSession.get().getUser());
template.setSysAdminTemplate(isSysAdminView);
} else {
template = scheduleTemplateDao.reLoad(template);
}
add(new ScheduleTemplateForm("templateForm", template));
}
class ScheduleTemplateForm extends Form<ScheduleTemplate> {
private static final long serialVersionUID = 1L;
private WebMarkupContainer addEventTemplateContainer;
private WebMarkupContainer eventTemplateListContainer;
private WebMarkupContainer feedbackContainer;
private FormFeedbackPanel<ScheduleTemplate> feedbackPanel;
private Label totalEstimatedTimeLabel;
private Long totalEstimatedTime = (long) 0;
public ScheduleTemplateForm(String id, final ScheduleTemplate template) {
super(id, new CompoundPropertyModel<ScheduleTemplate>(template));
feedbackContainer = new WebMarkupContainer("feedbackContainer");
feedbackContainer.setOutputMarkupId(true);
feedbackPanel = new FormFeedbackPanel<ScheduleTemplate>("feedbackPanel", this);
feedbackContainer.add(feedbackPanel);
add(feedbackContainer);
add(new TextField<String>("templateName").setRequired(true));
add(new TextArea<String>("templateDescription"));
add(new CheckBox("active"));
updateEstimatedTime();
totalEstimatedTimeLabel = new Label("totalEstimatedTime", new Model<Long>(){
private static final long serialVersionUID = 1L;
public Long getObject(){
updateEstimatedTime();
return totalEstimatedTime;
}
});
totalEstimatedTimeLabel.setOutputMarkupId(true);
add(totalEstimatedTimeLabel);
eventTemplateListContainer = new WebMarkupContainer("eventTemplateListContainer");
eventTemplateListContainer.setOutputMarkupId(true);
addEventTemplateContainer = new WebMarkupContainer("addEventTemplateContainer");
addEventTemplateContainer.setOutputMarkupId(true);
addEventTemplateContainer.add(new EmptyPanel("addEventTemplateFormPanel"));
add(addEventTemplateContainer);
WebMarkupContainer addEventTemplate = new WebMarkupContainer("addEventTemplate");
addEventTemplate.setOutputMarkupId(true);
addEventTemplate.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
addEventTemplateContainer.replace(new EventTemplateFormPanel("addEventTemplateFormPanel", new ProjectEventTemplate(), template, false){
private static final long serialVersionUID = 1L;
@Override
protected void onEventTemplateAdded(AjaxRequestTarget target){
System.out.println("Total now: " + totalEstimatedTimeLabel.getDefaultModelObject());
target.addComponent(totalEstimatedTimeLabel);
target.addComponent(eventTemplateListContainer);
target.appendJavascript(WiQueryCoreEffectsHelper.slideUpJs(addEventTemplateContainer, EffectSpeed.FAST));
}
@Override
protected void onEventTemplatedCanceled(AjaxRequestTarget target){
target.appendJavascript(WiQueryCoreEffectsHelper.slideUpJs(addEventTemplateContainer, EffectSpeed.FAST));
}
});
target.addComponent(WiQueryCoreEffectsHelper.slideDown(addEventTemplateContainer, EffectSpeed.FAST));
}
});
add(addEventTemplate);
final ListView<EventTemplate> eventList = new ListView<EventTemplate>("eventTemplates",
new ListModel<EventTemplate>(template.getEventTemplates())){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<EventTemplate> item) {
final EventTemplate et = item.getModelObject();
item.add(new Label("eventTemplateTitle", new Model<String>(et.getTitle())));
item.add(new Label("eventTemplateTimeConsumption", new Model<Long>(et.getEstimatedTimeConsumption())));
final WebMarkupContainer editEventContainer = new WebMarkupContainer("editEventTemplateContainer");
editEventContainer.setOutputMarkupId(true);
final WebMarkupContainer eventTemplateFormContainer = new WebMarkupContainer("eventTemplateFormContainer");
eventTemplateFormContainer.setOutputMarkupId(true);
eventTemplateFormContainer.add(new EmptyPanel("editEventTemplateFormPanel"));
editEventContainer.add(eventTemplateFormContainer);
item.add(editEventContainer);
WebMarkupContainer editEventTemplateIcon = new WebMarkupContainer("editEventTemplateIcon");
editEventTemplateIcon.setOutputMarkupId(true);
editEventTemplateIcon.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
eventTemplateFormContainer.replace(new EventTemplateFormPanel("editEventTemplateFormPanel", et, template, true){
private static final long serialVersionUID = 1L;
protected void onEventTemplateAdded(AjaxRequestTarget target){
target.addComponent(totalEstimatedTimeLabel);
target.addComponent(eventTemplateListContainer);
//Does not work...
target.appendJavascript(WiQueryCoreEffectsHelper.slideUpJs(editEventContainer, EffectSpeed.FAST));
}
protected void onEventTemplatedCanceled(AjaxRequestTarget target){
target.appendJavascript(WiQueryCoreEffectsHelper.slideUpJs(editEventContainer, EffectSpeed.FAST));
}
});
target.addComponent(WiQueryCoreEffectsHelper.slideDown(editEventContainer, EffectSpeed.FAST));
}
});
item.add(editEventTemplateIcon);
WebMarkupContainer deleteEventTempalteIcon = new WebMarkupContainer("deleteEventTemplateIcon");
deleteEventTempalteIcon.setOutputMarkupId(true);
deleteEventTempalteIcon.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
ScheduleTemplate tpl = ScheduleTemplateForm.this.getModelObject();
List<EventTemplate> evList = tpl.getEventTemplates();
//Decrease number in order with 1 for all events after the one being removed
for(int i = et.getNumberInOrder() + 1; i < evList.size(); i++){
evList.get(i).setNumberInOrder(i - 1);
}
evList.remove(et.getNumberInOrder());
target.addComponent(totalEstimatedTimeLabel);
target.addComponent(eventTemplateListContainer);
}
});
deleteEventTempalteIcon.add(new JavascriptEventConfirmation("onclick", "Are you sure?"));
item.add(deleteEventTempalteIcon);
item.setOutputMarkupId(true);
add(item);
}
};
SortableAjaxBehavior<ListItem<EventTemplate>> sortB = new SortableAjaxBehavior<ListItem<EventTemplate>>(){
private static final long serialVersionUID = 1L;
//If you have several lists and moving objects back and fourth this gets called when your list receives an element
@Override
public void onReceive(ListItem<EventTemplate> sortedComponent,
int index, Component parentSortedComponent,
AjaxRequestTarget ajaxRequestTarget) {
//Do nothing
}
//If you have several lists and moving objects back and fourth this gets called when an element gets removed from the list
@Override
public void onRemove(ListItem<EventTemplate> sortedComponent,
AjaxRequestTarget ajaxRequestTarget) {
//Do nothing
}
@Override
public void onUpdate(ListItem<EventTemplate> sortedComponent,
int index, AjaxRequestTarget ajaxRequestTarget) {
EventTemplate et = sortedComponent.getModelObject();
int prevNumberInOrder = et.getNumberInOrder();
List<EventTemplate> tList = template.getEventTemplates();
if(prevNumberInOrder > index){ //moving backwards
int i = index;
while(i < prevNumberInOrder){
EventTemplate e = tList.get(i++);
e.setNumberInOrder(e.getNumberInOrder()+1);
}
} else if(prevNumberInOrder < index){ //moving forward
int i = index;
while(i > prevNumberInOrder){
EventTemplate e = tList.get(i--);
e.setNumberInOrder(e.getNumberInOrder()-1);
}
}
et.setNumberInOrder(index);
Collections.sort(tList);
ajaxRequestTarget.addComponent(eventTemplateListContainer);
}
};
sortB.setConnectWith(".connectedSortable");
eventTemplateListContainer.add(sortB);
eventTemplateListContainer.add(eventList);
add(eventTemplateListContainer);
add(new AjaxButton("saveButton", new Model<String>("Save")){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
ScheduleTemplate st = (ScheduleTemplate) form.getModelObject();
st = scheduleTemplateDao.save(st);
form.info("Template saved");
target.addComponent(feedbackContainer);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form){
target.addComponent(feedbackContainer);
}
});
AjaxButton cancelButton = new AjaxButton("cancelButton", new Model<String>("Cancel")){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
setResponsePage(ScheduleTemplatePage.class);
}
};
cancelButton.setDefaultFormProcessing(false);
add(cancelButton);
}
private void updateEstimatedTime(){
long acc = 0;
for(EventTemplate e : getModelObject().getEventTemplates()){
acc += e.getEstimatedTimeConsumption();
}
totalEstimatedTime = acc;
}
}
}

@ -0,0 +1,40 @@
<wicket:panel>
<h3>Schedule templates</h3>
<div>
<div>
<span>Show templates:</span><select wicket:id="sysAdminDD"></select><br />
</div>
<div>
<span>Active:</span><select wicket:id="activeDD"></select>
</div>
<div>
<a href="#" wicket:id="createNew">Create new template</a>
</div>
</div>
<div wicket:id="templateListContainer">
<table>
<th>Template name</th>
<th>System template</th>
<th>Active</th>
<th>Creator</th>
<th>Last updated</th>
<tr wicket:id="templateList">
<td wicket:id="templateName">TempalteName</td>
<td wicket:id="isSysAdminTemplate">Is system template</td>
<td wicket:id="templateActive">Is active</td>
<td wicket:id="templateCreator">Creator</td>
<td wicket:id="templateUpdated">Last updated</td>
<td wicket:id="showScheduleTemplateDetailsIcon" class="icon icon-button icon-zoom-in"></td>
<td wicket:id="editScheduleTemplateIcon" class="icon icon-button icon-pencil"></td>
<td wicket:id="deleteScheduleTemplateIcon" class="icon icon-button icon-delete"></td>
</tr>
</table>
<div wicket:id="pager"></div>
</div>
<div wicket:id="templateDetailsContainer">
<div wicket:id="templateDetailsPanel"></div>
</div>
</wicket:panel>

@ -0,0 +1,244 @@
package se.su.dsv.scipro.schedule.templates.panels;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.extensions.ajax.markup.html.AjaxIndicatorAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PageableListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.core.effects.EffectSpeed;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplateEditorPage;
import se.su.dsv.scipro.schedule.templates.panels.models.ScheduleTemplatesModel;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
import se.su.dsv.scipro.util.SelectOption;
import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
public class ScheduleTemplatePanel extends Panel {
private static final long serialVersionUID = 6197924655284748823L;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public enum ActiveOption {
ALL,
ACTIVE,
INACTIVE
}
public enum SysAdminOption {
ALL,
ONLY_SYSADMIN,
ONLY_SUPERVISOR,
ONLY_LOGGED_IN_USER
}
private WebMarkupContainer templateListContainer;
private ScheduleTemplatesModel templateModel;
private WebMarkupContainer templateDetailsContainer;
public ScheduleTemplatePanel(String id, final boolean isSysAdminView) {
super(id);
templateModel = new ScheduleTemplatesModel();
templateDetailsContainer = new WebMarkupContainer("templateDetailsContainer");
templateDetailsContainer.setOutputMarkupId(true);
templateDetailsContainer.add(new EmptyPanel("templateDetailsPanel"));
templateListContainer = new WebMarkupContainer("templateListContainer");
templateListContainer.setOutputMarkupId(true);
final PatternDateConverter pc = new PatternDateConverter("yyyy-MM-dd", false);
final PageableListView<ScheduleTemplate> templateList = new PageableListView<ScheduleTemplate>("templateList", templateModel, 10){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ScheduleTemplate> item) {
final ScheduleTemplate s = item.getModelObject();
item.add(new Label("templateName", s.getTemplateName()));
Label active = new Label("templateActive", "");
active.add(new AttributeAppender("class", new Model<String>("icon " + (s.isActive() ? "icon-check" : "icon-delete")), " "));
item.add(active);
Label isSysAdminTemplate = new Label("isSysAdminTemplate", "");
isSysAdminTemplate.add(new AttributeAppender("class", new Model<String>("icon " + (s.isSysAdminTemplate() ? "icon-check" : "icon-delete")), " "));
item.add(isSysAdminTemplate);
item.add(s.getCreator().getWebLabel("templateCreator"));
item.add(new DateLabel("templateUpdated", new Model<Date>(s.getLastModified()), pc));
WebMarkupContainer editScheduleTemplateIcon = new WebMarkupContainer("editScheduleTemplateIcon");
editScheduleTemplateIcon.setOutputMarkupId(true);
editScheduleTemplateIcon.setVisible( s.getCreator().equals(SciProSession.get().getUser()) || isSysAdminView);
editScheduleTemplateIcon.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
setResponsePage(new ScheduleTemplateEditorPage(new PageParameters(), s.getId()));
}
});
item.add(editScheduleTemplateIcon);
WebMarkupContainer deleteScheduleTemplateIcon = new WebMarkupContainer("deleteScheduleTemplateIcon");
deleteScheduleTemplateIcon.setOutputMarkupId(true);
deleteScheduleTemplateIcon.setVisible( s.getCreator().equals(SciProSession.get().getUser()) || isSysAdminView);
deleteScheduleTemplateIcon.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
ScheduleTemplate toBeRemoved = scheduleTemplateDao.reLoad(s);
scheduleTemplateDao.delete(toBeRemoved);
target.addComponent(templateListContainer);
}
});
deleteScheduleTemplateIcon.add(new JavascriptEventConfirmation("onclick", "Are you sure you want to delete this template and all of its events?"));
item.add(deleteScheduleTemplateIcon);
WebMarkupContainer showScheduleTemplateDetailsIcon = new WebMarkupContainer("showScheduleTemplateDetailsIcon");
showScheduleTemplateDetailsIcon.setOutputMarkupId(true);
showScheduleTemplateDetailsIcon.add(new AjaxEventBehavior("onclick"){
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
templateDetailsContainer.replace(new ScheduleTemplateDetailsPanel("templateDetailsPanel", s));
target.addComponent(WiQueryCoreEffectsHelper.fadeIn(templateDetailsContainer, EffectSpeed.FAST));
}
});
item.add(showScheduleTemplateDetailsIcon);
add(item);
}
};
final AjaxPagingNavigator pager = new AjaxPagingNavigator("pager", templateList) {
private static final long serialVersionUID = 1L;
@Override
protected void onAjaxEvent(AjaxRequestTarget target) {
target.addComponent(WiQueryCoreEffectsHelper.fadeIn(templateListContainer, EffectSpeed.FAST));
}
};
final List<SelectOption<ActiveOption>> activeOptions = new ArrayList<SelectOption<ActiveOption>>();
activeOptions.add(new SelectOption<ActiveOption>("All", ActiveOption.ALL));
activeOptions.add(new SelectOption<ActiveOption>("Active", ActiveOption.ACTIVE));
activeOptions.add(new SelectOption<ActiveOption>("Inactive", ActiveOption.INACTIVE));
final DropDownChoice<SelectOption<ActiveOption>> activeDD =
new DropDownChoice<SelectOption<ActiveOption>>("activeDD", new Model<SelectOption<ActiveOption>>(activeOptions.get(0)),activeOptions);
activeDD.add(new AjaxFormComponentUpdatingBehavior("onchange"){
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
ActiveOption selected = activeDD.getModelObject().value;
switch(selected) {
case ALL:
templateModel.setOnlyActiveTemplates(null);
break;
case ACTIVE:
templateModel.setOnlyActiveTemplates(true);
break;
case INACTIVE:
templateModel.setOnlyActiveTemplates(false);
break;
default:
templateModel.setOnlyActiveTemplates(null);
}
target.addComponent(WiQueryCoreEffectsHelper.fadeIn(templateListContainer, EffectSpeed.FAST));
}
});
add(activeDD);
final List<SelectOption<SysAdminOption>> sysadminOptions = new ArrayList<SelectOption<SysAdminOption>>();
sysadminOptions.add(new SelectOption<SysAdminOption>("All templates", SysAdminOption.ALL));
sysadminOptions.add(new SelectOption<SysAdminOption>("Only system templates", SysAdminOption.ONLY_SYSADMIN));
sysadminOptions.add(new SelectOption<SysAdminOption>("Only supervisor templates", SysAdminOption.ONLY_SUPERVISOR));
sysadminOptions.add(new SelectOption<SysAdminOption>("Only mine", SysAdminOption.ONLY_LOGGED_IN_USER));
final DropDownChoice<SelectOption<SysAdminOption>> sysAdminDD =
new DropDownChoice<SelectOption<SysAdminOption>>("sysAdminDD", new Model<SelectOption<SysAdminOption>>(sysadminOptions.get(0)),sysadminOptions);
sysAdminDD.add(new AjaxFormComponentUpdatingBehavior("onchange"){
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
SysAdminOption selected = sysAdminDD.getModelObject().value;
switch(selected) {
case ALL:
templateModel.clearFilter(true);
templateModel.setOnlySysAdminTemplates(null);
break;
case ONLY_SYSADMIN:
templateModel.clearFilter(false);
templateModel.setOnlySysAdminTemplates(true);
break;
case ONLY_SUPERVISOR:
templateModel.clearFilter(false);
templateModel.setOnlySysAdminTemplates(false);
break;
case ONLY_LOGGED_IN_USER:
templateModel.clearFilter(false);
templateModel.setCreator(SciProSession.get().getUser());
break;
default:
templateModel.clearFilter(true);
}
target.addComponent(WiQueryCoreEffectsHelper.fadeIn(templateListContainer, EffectSpeed.FAST));
}
});
sysAdminDD.add(new AjaxIndicatorAppender());
add(sysAdminDD);
templateListContainer.add(pager);
templateListContainer.add(templateList);
add(templateListContainer);
add(new Link<Void>("createNew"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(ScheduleTemplateEditorPage.class);
}
});
add(templateDetailsContainer);
}
public void reloadTemplateList(){
templateModel.reloadModel();
}
}

@ -0,0 +1,89 @@
package se.su.dsv.scipro.schedule.templates.panels.models;
import java.util.List;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.data.dataobjects.User;
/**
* @author dan
*/
public class ScheduleTemplatesModel extends LoadableDetachableModel<List<ScheduleTemplate>>{
private static final long serialVersionUID = 514862281817276921L;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
private ProjectClass projectClass = null;
private Boolean onlyActiveTemplates = null;
private User creator = null;
private Boolean onlySysAdminTemplates = null;
public ScheduleTemplatesModel(){
InjectorHolder.getInjector().inject(this);
}
@Override
protected List<ScheduleTemplate> load() {
List<ScheduleTemplate> list = scheduleTemplateDao.getScheduleTemplates(creator, onlySysAdminTemplates, onlyActiveTemplates, projectClass);
System.out.println("Found " + list.size() + " templates");
return list;
}
public void reloadModel(){
setObject(load());
}
public void setOnlySysAdminTemplates(Boolean onlySysAdminTemplates) {
this.onlySysAdminTemplates = onlySysAdminTemplates;
}
public Boolean getOnlySysAdminTemplates() {
return onlySysAdminTemplates;
}
public Boolean isOnlyActiveTemplates() {
return onlyActiveTemplates;
}
public void setOnlyActiveTemplates(Boolean onlyActiveTemplates) {
this.onlyActiveTemplates = onlyActiveTemplates;
reloadModel();
}
public ProjectClass getProjectClass() {
return projectClass;
}
public void setProjectClass(ProjectClass projectClass) {
this.projectClass = projectClass;
reloadModel();
}
public User getCreator() {
return creator;
}
public void setCreator(User creator) {
this.creator = creator;
reloadModel();
}
public void clearFilter(boolean withReload){
projectClass = null;
onlyActiveTemplates = null;
creator = null;
onlySysAdminTemplates = null;
if(withReload){
reloadModel();
}
}
}

@ -0,0 +1,29 @@
package se.su.dsv.scipro.schedule.templates.panels.models;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
public class SelectedScheduleTemplateModel extends LoadableDetachableModel<ScheduleTemplate> {
private static final long serialVersionUID = 7788734120202052793L;
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
private Long scheduleTemplateId;
public SelectedScheduleTemplateModel(Long scheduleTemplateId){
InjectorHolder.getInjector().inject(this);
this.scheduleTemplateId = scheduleTemplateId;
}
@Override
protected ScheduleTemplate load() {
return scheduleTemplateDao.load(scheduleTemplateId);
}
}