Merge branch 'ajaxRefactoring' into develop

This commit is contained in:
Emil Siverhall 2012-03-26 15:17:00 +02:00
commit c684abaabf
8 changed files with 238 additions and 90 deletions

@ -3,33 +3,42 @@
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div wicket:id="detailsDialog">
<div wicket:id="dialogContent"></div>
</div>
<form wicket:id="form">
<h5 class="peer-title append-bottom">Manage supervisors</h5>
<div class="span-22 last">
<div class="span-14">
<label for="supervisorField">Search using supervisor name:</label><br />
<input style="width:300px;" wicket:id="supervisorField" type="text" /><br />
<label for="keywordField">Search on keywords used by supervisor:</label><br />
<input style="width:300px;" wicket:id="keywordField" type="text" />
<div class="span-22 prepend-top append-bottom last">
<div class="span-5">
</div>
<div class="span-8 last">
<label>DO NOT TOUCH unless you know what you're doing!</label>
<div><button wicket:id="resetAllBachelorButton">Reset all supervisor Bachelor count numbers</button></div>
<div><button wicket:id="resetAllMasterButton">Reset all supervisor Master count numbers</button></div>
</div>
<div class="span-20">
<div class="span-8">
<label for="unitPanel">Filter by unit:</label><br />
<span wicket:id="unitPanel"></span>
</div>
<div class="span-5">
<div class="span-10">
<label for="researchAreaPanel">Filter by research area:</label>
<span wicket:id="researchAreaPanel"></span>
</div>
<div class="span-5 last append-bottom">
<label>Filter</label>
<div class="append-bottom"><input wicket:id="filterButton" type="submit" /></div>
<label>DO NOT TOUCH unless you know what you're doing!</label>
<div><button wicket:id="resetAllBachelorButton">Reset all supervisor Bachelor count numbers</button></div>
<div><button wicket:id="resetAllMasterButton">Reset all supervisor Master count numbers</button></div>
</div>
<div class="span-5 last">
<div class="prepend-top"><input wicket:id="filterButton" type="submit" /></div>
</div>
</div>
</form>
<div wicket:id="container">
<span class="right">Supervisors per page: <select wicket:id="itemsPerPage"></select></span>
<div class="span-22 last">
<table class="rounded-corner">
<thead>
@ -49,10 +58,8 @@
</tfoot>
<tbody>
<tr wicket:id="dataView">
<td wicket:id="supervisor"></td>
<td><a href="#" wicket:id="detailsLink"><span wicket:id="supervisor"></span></a></td>
<td wicket:id="unit"></td>
<!--<td wicket:id="targetBachelor"></td>
<td wicket:id="targetMaster"></td>-->
<td><select wicket:id="targetBachelor"></select></td>
<td><select wicket:id="targetMaster"></select></td>
<td><span wicket:id="currentBachelor"></span> (<span wicket:id="bachelorDate"></span>)</td>
@ -65,7 +72,7 @@
</tbody>
</table>
</div>
<div wicket:id="nav"></div>
<div class="span-15 last" wicket:id="nav"></div>
</div>
</wicket:panel>

@ -1,6 +1,7 @@
package se.su.dsv.scipro.match.panel;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -16,6 +17,7 @@ import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
@ -24,9 +26,12 @@ import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.components.ItemsPerPageChoice;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.dataproviders.QueryableDataProvider;
import se.su.dsv.scipro.match.dao.interfaces.KeywordDao;
import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
@ -46,7 +51,7 @@ public class AdminManageSupervisorPanel extends Panel {
private SupervisorDao supervisorDao;
@SpringBean
ProjectClassDao projectClassDao;
private ProjectClassDao projectClassDao;
@SpringBean
private KeywordDao keywordDao;
@ -55,76 +60,102 @@ public class AdminManageSupervisorPanel extends Panel {
private KeywordTypeDao keywordTypeDao;
private WebMarkupContainer container;
//private SupervisorDataProvider provider;
private Label emptyLabel;
private SupervisorDaoParams params;
private QueryableDataProvider<Employee, SupervisorDaoParams> provider;
private Component feedbackPanel;
private DataView<Employee> dataView;
private Dialog dialog;
private ItemsPerPageChoice itemsPerPageChoice;
public AdminManageSupervisorPanel(String id, final Component feedbackPanel__){
super(id);
feedbackPanel= feedbackPanel__;
dialogSetup();
dataViewSetup();
FilterForm form = new FilterForm("form");
add(form);
}
private void dialogSetup() {
dialog = new Dialog("detailsDialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
dialog.setWidth(885);
dialog.add(new EmptyPanel("dialogContent"));
dialog.setOutputMarkupId(true);
add(dialog);
}
private void dataViewSetup(){
container = new WebMarkupContainer("container");
//Add info for the user should there be no events to display.
emptyLabel = new Label("emptyLabel", "No events to show.");
container.add(emptyLabel);
emptyLabel = new Label("emptyLabel", "No supervisors matched your search criteria.");
emptyLabel.setOutputMarkupId(true); //Needs to be AJAX-enabled.
container.setOutputMarkupId(true);
//container.add(dataView);
add(container);
params = new SupervisorDaoParams();
updateListView();
emptyLabel.setVisible(provider.size()==0); //Rule for the empty label
provider = new QueryableDataProvider<Employee, SupervisorDaoParams>(
supervisorDao, params);
loadUserDataView(provider);
}
/*
private void updateListView() {
container.removeAll();
provider = new QueryableDataProvider<Employee, SupervisorDaoParams>(
supervisorDao, params);
loadUserDataView(provider);
};
};*/
public void loadUserDataView(IDataProvider<Employee> provider) {
DataView<Employee> dataView = new DataView<Employee>("dataView", provider) {
dataView = new DataView<Employee>("dataView", provider) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final Item<Employee> item) {
final Employee supervisor = item.getModelObject();
List<Keyword> keywords = supervisor.getKeywords().getFiltered("Unit");
List<Keyword> keywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.UNIT.toDbName());
String unit = "";
if (!keywords.isEmpty()) {
unit += keywords.get(0).getKeyword();
}
Availability bachelorAvalibality = supervisorDao.getAvailability(supervisor, projectClassDao.getProjectClass("BACHELOR"));
Availability masterAvalibality = supervisorDao.getAvailability(supervisor, projectClassDao.getProjectClass("MASTER"));
Availability bachelorAvalibality = supervisorDao.getAvailability(supervisor, projectClassDao.getProjectClass(ProjectClass.BACHELOR));
Availability masterAvalibality = supervisorDao.getAvailability(supervisor, projectClassDao.getProjectClass(ProjectClass.MASTER));
item.add(new AdminSupervisorDetailsPanel("supervisor", item.getModel(), feedbackPanel));
final AjaxLink<Void> detailsLink = new AjaxLink<Void>("detailsLink") {
private static final long serialVersionUID = 1340379052190115333L;
@Override
public void onClick(AjaxRequestTarget target) {
dialog.setTitle("Details for: " + supervisor.getNameAsString());
dialog.replace(new AdminSupervisorDetailsPanel("dialogContent", item.getModel(), feedbackPanel));
target.addComponent(dialog);
dialog.open(target);
}
};
detailsLink.add(new Label("supervisor", supervisor.getNameAsString()));
item.add(detailsLink);
item.add(new Label("unit", new Model<String>(unit)));
item.add(createDropDown(new Model<Availability>(bachelorAvalibality), "numCapable", "targetBachelor"));
item.add(createDropDown(new Model<Availability>(masterAvalibality), "numCapable", "targetMaster"));
item.add(new Label("currentBachelor", new Model<Integer>((bachelorAvalibality.getNumMatched().intValue()))));
if (supervisor.getCountFromDate(projectClassDao.getProjectClass("BACHELOR")) != null) {
if (supervisor.getCountFromDate(projectClassDao.getProjectClass(ProjectClass.BACHELOR)) != null) {
item.add(new DateFormatter(DateFormatter.FORMAT.EXTENDED).createFormattedDateLabel("bachelorDate", supervisor.getCountFromDate(projectClassDao.getProjectClass("BACHELOR"))));
} else {
item.add(new Label("bachelorDate", "no date"));
}
item.add(new Label("currentMaster", new Model<Integer>(masterAvalibality.getNumMatched().intValue())));
if (supervisor.getCountFromDate(projectClassDao.getProjectClass("MASTER")) != null) {
if (supervisor.getCountFromDate(projectClassDao.getProjectClass(ProjectClass.MASTER)) != null) {
item.add(new DateFormatter(DateFormatter.FORMAT.EXTENDED).createFormattedDateLabel("masterDate", supervisor.getCountFromDate(projectClassDao.getProjectClass("MASTER"))));
} else {
item.add(new Label("masterDate", "no date"));
@ -133,6 +164,21 @@ public class AdminManageSupervisorPanel extends Panel {
}
};
dataView.setItemsPerPage(10);
emptyLabel.setVisible(dataView.getItemCount()==0);
itemsPerPageChoice = new ItemsPerPageChoice("itemsPerPage");
itemsPerPageChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 4143017524829639803L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
dataView.setItemsPerPage(itemsPerPageChoice.getModelObject());
target.addComponent(container);
}
});
container.add(itemsPerPageChoice);
container.add(dataView);
container.add(emptyLabel);
container.add(new PagingNavigator("nav", dataView));
@ -191,7 +237,7 @@ public class AdminManageSupervisorPanel extends Panel {
private static final long serialVersionUID = 1L;
private TextField<String> supervisorField, keywordField;
private FilterFormKeywordPanel unitPanel, researchAreaPanel;
private FilterKeywordDropdownPanel researchAreaPanel, unitPanel;
public FilterForm(String id) {
super(id);
@ -200,6 +246,11 @@ public class AdminManageSupervisorPanel extends Panel {
add(supervisorField);
add(keywordField);
researchAreaPanel = new FilterKeywordDropdownPanel("researchAreaPanel", KeywordTypeDao.TYPE.RESEARCH_AREA);
unitPanel = new FilterKeywordDropdownPanel("unitPanel", KeywordTypeDao.TYPE.UNIT);
add(unitPanel);
add(researchAreaPanel);
AjaxButton filterButton = new AjaxButton("filterButton", new Model<String>("Filter")) {
private static final long serialVersionUID = 1L;
@ -207,10 +258,13 @@ public class AdminManageSupervisorPanel extends Panel {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
container.removeAll();
params = new SupervisorDaoParams();
List<Keyword> keywords = unitPanel.getSelectedKeywords();
keywords.addAll(researchAreaPanel.getSelectedKeywords());
Set<Keyword> keywords = new HashSet<Keyword>();
if(unitPanel.getSelectedKeywords()!=null&&!unitPanel.getSelectedKeywords().isEmpty()){
keywords.addAll(unitPanel.getSelectedKeywords());
}
if(researchAreaPanel.getSelectedKeywords()!=null&&!researchAreaPanel.getSelectedKeywords().isEmpty()) {
keywords.addAll(researchAreaPanel.getSelectedKeywords());
}
KeywordType kwType = keywordTypeDao.findByType(KeywordTypeDao.TYPE.REGULAR);
Set<Keyword> tmpWords = keywordDao.getKeywords(kwType, true);
@ -222,26 +276,24 @@ public class AdminManageSupervisorPanel extends Panel {
if(!keywords.isEmpty()){
params.setKeywords(keywords);
} else {
params.setKeywords(null);
}
params.setNameLike(supervisorField.getModelObject());
emptyLabel.setVisible(dataView.getItemCount()==0); //Rule for the empty label
target.addComponent(container);
loadUserDataView(new QueryableDataProvider<Employee, SupervisorDaoParams>(
supervisorDao, params));
}
};
unitPanel = new FilterFormKeywordPanel("unitPanel", KeywordTypeDao.TYPE.UNIT);
researchAreaPanel = new FilterFormKeywordPanel("researchAreaPanel", KeywordTypeDao.TYPE.RESEARCH_AREA);
add(unitPanel);
add(researchAreaPanel);
add(filterButton);
AjaxLink resetAllBachelor = new AjaxLink("resetAllBachelorButton"){
@Override
public void onClick(AjaxRequestTarget target) {
supervisorDao.resetCountFromDate(projectClassDao.getProjectClass("BACHELOR"));
supervisorDao.resetCountFromDate(projectClassDao.getProjectClass(ProjectClass.BACHELOR));
target.addComponent(container);
}
};
@ -253,7 +305,7 @@ public class AdminManageSupervisorPanel extends Panel {
AjaxLink resetAllMaster = new AjaxLink("resetAllMasterButton"){
@Override
public void onClick(AjaxRequestTarget target) {
supervisorDao.resetCountFromDate(projectClassDao.getProjectClass("MASTER"));
supervisorDao.resetCountFromDate(projectClassDao.getProjectClass(ProjectClass.MASTER));
target.addComponent(container);
}
};

@ -2,10 +2,7 @@
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<a href="#" wicket:id="dialogLink">
<span wicket:id="linkLabel"></span>
</a>
<div wicket:id="dialog">
<div>
<a href="#" wicket:id="detailsLink">Project idea details</a>
|
<a href="#" wicket:id="profileLink">Profile</a>

@ -3,12 +3,9 @@ package se.su.dsv.scipro.match.panel;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dataobjects.Employee;
@ -22,18 +19,14 @@ public class AdminSupervisorDetailsPanel extends Panel {
@SpringBean
private UserDao userDao;
@SpringBean
private SupervisorDao supervisorDao;
@SpringBean
private UserProfilePanelFactory factory;
private Panel detailsPanel;
private Panel profilePanel;
private Panel currentPanel;
private Dialog dialog;
private AjaxFallbackLink<Void> detailsLink;
private AjaxFallbackLink<Void> profileLink;
@ -43,27 +36,6 @@ public class AdminSupervisorDetailsPanel extends Panel {
final User supervisor = userDao.reLoad(model.getObject().getUser());
if (supervisor != null) {
dialog = new Dialog("dialog");
dialog.setTitle("Details for " + supervisor.getFullName());
dialog.setWidth(885);
add(dialog);
AjaxLink<Void> dialogLink = new AjaxLink<Void>("dialogLink") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
if (target != null) {
dialog.open(target);
}
}
};
dialogLink.add(new Label("linkLabel", supervisor.getFullName()));
add(dialogLink);
detailsPanel = new SupervisedProjectsPanel("mainPanel", model, feedBackPanel);
profilePanel = factory.createUserProfilePanelForUser("mainPanel",model.getObject().getUser());
currentPanel = detailsPanel;
@ -92,7 +64,7 @@ public class AdminSupervisorDetailsPanel extends Panel {
}
};
detailsLink.setOutputMarkupId(true);
dialog.add(detailsLink);
add(detailsLink);
profileLink = new AjaxFallbackLink<Void>("profileLink") {
@ -119,9 +91,9 @@ public class AdminSupervisorDetailsPanel extends Panel {
}
};
profileLink.setOutputMarkupId(true);
dialog.add(profileLink);
add(profileLink);
dialog.add(currentPanel);
add(currentPanel);
} else {
this.setVisible(false);
}

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
</head>
<body>
<wicket:panel>
<div wicket:id="container">
<select wicket:id="dropdown"></select>
<div wicket:id="listView">
<span wicket:id="name"></span>&nbsp;<a href="#" wicket:id="removeLink"><img wicket:id="removeIcon" /></a>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,99 @@
package se.su.dsv.scipro.match.panel;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
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.form.DropDownChoice;
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.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.icons.ImageObject;
import se.su.dsv.scipro.match.dao.interfaces.KeywordDao;
import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.KeywordType;
/**
* Keyword filtering component that takes a Keyword type in the constructor.
* The component is a multiple choice dropdown, where the selected choices is being rendered underneath the choice component.
*/
public class FilterKeywordDropdownPanel extends Panel {
private static final long serialVersionUID = 8862892008428526067L;
@SpringBean
private KeywordDao keywordDao;
@SpringBean
private KeywordTypeDao keywordTypeDao;
private List<Keyword> remoteKeywords, selected;
public FilterKeywordDropdownPanel(String id, KeywordTypeDao.TYPE type) {
super(id);
final WebMarkupContainer container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
KeywordType kwType = keywordTypeDao.findByType(type);
KeywordDao.Params params = new KeywordDao.Params();
params.setType(kwType);
params.setIncludeDeleted(true);
remoteKeywords = keywordDao.getKeywordList(params);
selected = new ArrayList<Keyword>();
IModel<Keyword> model = new Model<Keyword>();
final DropDownChoice<Keyword> dropdown = new DropDownChoice<Keyword>("dropdown",model, remoteKeywords);
dropdown.add(new AjaxFormComponentUpdatingBehavior("onchange"){
private static final long serialVersionUID = 1027524203735088565L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
selected.add(dropdown.getModelObject());
target.addComponent(container);
}
});
ListView<Keyword> listView = new ListView<Keyword>("listView", selected) {
private static final long serialVersionUID = -1999361159123892309L;
@Override
protected void populateItem(final ListItem<Keyword> item) {
item.add(new Label("name", item.getModelObject().getKeyword()));
final ImageObject removeIcon = new ImageObject("removeIcon", ImageObject.SIXTEEN + ImageObject.DELETE);
final AjaxLink<Void> remove = new AjaxLink<Void>("removeLink") {
private static final long serialVersionUID = -5129451036772812285L;
@Override
public void onClick(AjaxRequestTarget target) {
selected.remove(item.getModelObject());
target.addComponent(container);
}
};
remove.add(removeIcon);
item.add(remove);
add(item);
}
};
;
container.add(dropdown);
container.add(listView);
add(container);
}
public List<Keyword> getSelectedKeywords(){
return this.selected;
}
}

@ -0,0 +1,2 @@
dropdown.nullValid=Choose one or more:
dropdown.null=Choose one or more:

@ -1,5 +1,6 @@
package se.su.dsv.scipro.supervisor.panels;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -7,11 +8,11 @@ import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
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.form.Radio;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
@ -20,9 +21,6 @@ import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import edu.emory.mathcs.backport.java.util.Arrays;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.enums.ProjectStatus;
@ -99,10 +97,11 @@ public class SupervisorProjectsOverviewPanel extends Panel {
headerMap.put("dateCreated", "Date created");
for(final SortSpecifier spec : dataProvider.getAvailableSortSpecifiers(sortFields)){
final String fieldBaseName = spec.getFieldName();
final Link<Void> link = new Link<Void>(fieldBaseName+"Sort"){
private static final long serialVersionUID = 1L;
final AjaxLink<Void> link = new AjaxLink<Void>(fieldBaseName+"Sort"){
private static final long serialVersionUID = 2456771709235781591L;
@Override
public void onClick(){
public void onClick(AjaxRequestTarget target) {
SortSpecifier current = dataProvider.getSortSpecifier();
if(!spec.equals(current)){
dataProvider.setSortSpecifier(spec);
@ -110,8 +109,10 @@ public class SupervisorProjectsOverviewPanel extends Panel {
}else{
dataProvider.setAscendingOrder(!dataProvider.isAscendingOrder());
}
target.addComponent(wmc);
}
};
};
link.add(new Label(fieldBaseName+"Label",headerMap.get(fieldBaseName)));
wmc.add(link);
}