Merge branch 'develop' of ssh://git.dsv.su.se/git/scipro/scipro into develop

This commit is contained in:
fred-fri 2012-10-01 11:38:21 +09:00
commit 3186597bdc
17 changed files with 675 additions and 21 deletions

@ -154,6 +154,7 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
mountBookmarkablePage("admin/projectpartner", AdminProjectPartnerPage.class);
mountBookmarkablePage("admin/checklist", AdminCheckListPage.class);
mountBookmarkablePage("admin/match/projectideas", AdminManageProjectIdeaPage.class);
mountBookmarkablePage("admin/match/studentideapopup", AdminIdeaPopupPage.class);
mountBookmarkablePage("admin/match/keywords", AdminKeywordPage.class);
mountBookmarkablePage("admin/match/exemptions", AdminExemptionPage.class);
mountBookmarkablePage("admin/match/supervisors", AdminSupervisorSettingsPage.class);

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<wicket:remove>
<link rel="stylesheet" type="text/css"
href="../../../../../../webapp/css/scipro.css" />
<link rel="stylesheet" type="text/css"
href="../../../../../../webapp/css/blueprint/screen.css" />
</wicket:remove>
<body>
<wicket:extend>
<div wicket:id="matchPanel"></div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,28 @@
package se.su.dsv.scipro.admin.pages.match;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.CSSPackageResource;
import se.su.dsv.scipro.admin.panels.AdminManualMatchPopupPanel;
import se.su.dsv.scipro.basepages.BasePage;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@Authorization(authorizedRoles = { Roles.ADMIN, Roles.SYSADMIN})
public class AdminIdeaPopupPage extends BasePage {
public AdminIdeaPopupPage(){
super();
setUp();
}
public AdminIdeaPopupPage(PageParameters pp){
super(pp);
setUp();
}
private void setUp(){
add(CSSPackageResource.getHeaderContribution("css/popup.css", "screen, projection"));
add(new AdminManualMatchPopupPanel("matchPanel"));
}
}

@ -0,0 +1,37 @@
<!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">
<h2>Project ideas submitted by students</h2>
<form wicket:id="filterForm">
<div class="span-6">
<label>Filter by idea title:</label><br />
<input type="text" wicket:id="titleFilter" />
<br/>
<label>Filter by supervisor:</label>
<br/>
<input wicket:id="supervisorFilter"/>
</div>
<div class="span-6">
<label>Filter by created between:</label><br />
<div class="span-6" wicket:id="dateFilter"></div>
</div>
<div class="span-10">
<div class="span-10" wicket:id="unitFilter"></div>
<div class="span-10" wicket:id="areaFilter"></div>
</div>
<div class="span-8 append-bottom">
<div wicket:id="statusFilter"></div>
</div>
</form>
<div wicket:id="feedback"></div>
<div wicket:id="dataTable"></div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,321 @@
package se.su.dsv.scipro.admin.panels;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
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.joda.time.DateTime;
import org.springframework.data.domain.PageRequest;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.admin.panels.match.EmployeeAutoCompleteDivPanel;
import se.su.dsv.scipro.components.DatePickerPanel;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.datatables.DateColumn;
import se.su.dsv.scipro.datatables.GenericDataPanel;
import se.su.dsv.scipro.match.dao.interfaces.MatchDao;
import se.su.dsv.scipro.match.dataobject.Availability;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.Match.Status;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.panel.FilterFormAreaPanel;
import se.su.dsv.scipro.match.panel.FilterFormCheckBoxPanel;
import se.su.dsv.scipro.match.panel.FilterFormUnitPanel;
import se.su.dsv.scipro.reusable.EmployeeAutoComplete;
import se.su.dsv.scipro.reusable.SafeLongToIntService;
import se.su.dsv.scipro.springdata.services.GenericService;
import se.su.dsv.scipro.springdata.services.ProjectClassService;
import se.su.dsv.scipro.springdata.services.ProjectIdeaService;
import se.su.dsv.scipro.springdata.services.SupervisorService;
public class AdminManualMatchPopupPanel extends Panel {
private static final long serialVersionUID = 4793881695608689835L;
@SpringBean
private ProjectIdeaService projectIdeaService;
@SpringBean
private SupervisorService supervisorService;
@SpringBean
private ProjectClassService projectClassService;
@SpringBean
private MatchDao matchDao;
private Availability bachelorAvailability;
private Availability masterAvailability;
private ProjectIdeaService.FilterParams params;
private GenericDataPanel<ProjectIdea> genericDataPanel;
public AdminManualMatchPopupPanel(String id) {
super(id);
WebMarkupContainer container = new WebMarkupContainer("container");
FeedbackPanel feedback = new FeedbackPanel("feedback");
container.setOutputMarkupId(true);
feedback.setOutputMarkupId(true);
container.add(feedback);
container.add(new FilterForm("filterForm"));
add(container);
addDataTable(container, feedback);
}
private void addDataTable(final WebMarkupContainer container, final FeedbackPanel feedback) {
final ProjectClass bachelor = projectClassService.getProjectClass(ProjectClass.BACHELOR);
final ProjectClass master = projectClassService.getProjectClass(ProjectClass.MASTER);
container.add(genericDataPanel = new GenericDataPanel<ProjectIdea>("dataTable") {
private static final long serialVersionUID = -8870992640544682269L;
@Override
public Iterator<ProjectIdea> getIterator() {
return projectIdeaService.findAll(params, new PageRequest(getTable().getCurrentPage(), getTable().getRowsPerPage(), getSort())).iterator();
}
@Override
public int getSize() {
return SafeLongToIntService.safeLongToInt(projectIdeaService.countAll(params));
}
@Override
public GenericService<ProjectIdea, Long> getService() {
return projectIdeaService;
}
@Override
public String getSortString() {
return "dateCreated";
}
@Override
public IColumn[] getColumns() {
IColumn[] columns = new IColumn[17];
columns[0] = new DateColumn<ProjectIdea>(Model.of("Date created"), "dateCreated", "dateCreated");
columns[1] = new PropertyColumn<ProjectIdea>(Model.of("Level"), "projectClass", "projectClass");
columns[2] = new PropertyColumn<ProjectIdea>(Model.of("Title"), "title", "title");
columns[3] = new PropertyColumn<ProjectIdea>(Model.of("Research area"), "researchArea.title", "researchArea");
columns[4] = new PropertyColumn<ProjectIdea>(Model.of("Keywords"), "keywords");
columns[5] = new PropertyColumn<ProjectIdea>(Model.of("Authors"), "authors");
columns[6] = new PropertyColumn<ProjectIdea>(Model.of("What?"), "watson.what");
columns[7] = new PropertyColumn<ProjectIdea>(Model.of("Why?"), "watson.why");
columns[8] = new PropertyColumn<ProjectIdea>(Model.of("Theoretically how?"), "watson.theoryHow");
columns[9] = new PropertyColumn<ProjectIdea>(Model.of("Practically how?"), "watson.practicalHow");
columns[10] = new PropertyColumn<ProjectIdea>(Model.of("Status"), "match.status");
columns[11] = new AbstractColumn<ProjectIdea>(Model.of("Matched to")) {
private static final long serialVersionUID = 3528926412798195365L;
@Override
public void populateItem(Item<ICellPopulator<ProjectIdea>> item, String s, IModel<ProjectIdea> ideaModel) {
final ProjectIdea pi = ideaModel.getObject();
item.add(new EmployeeAutoCompleteDivPanel(s, new Model<Employee>(pi.getMatch().getSupervisor())) {
private static final long serialVersionUID = -2882302901258128862L;
@Override
public void onNewEmployeeSelection(AjaxRequestTarget target, Employee newSelection) {
matchDao.confirmToSuperviseIdea(SciProSession.get().getUser(), newSelection, pi.getMatch());
info("Supervisor changed to "+ newSelection.getNameAsString()+ " on idea '"+pi.getTitle()+"'");
target.addComponent(feedback);
target.addComponent(container);
}
}.setEnabled(pi.getProject()==null));
}
};
columns[12] = new PropertyColumn<ProjectIdea>(Model.of("Supervisor unit"), "match.supervisor.unit");
columns[13] = new AbstractColumn<ProjectIdea>(Model.of("Supervisor target bachelor")){
private static final long serialVersionUID = -5738067174876825903L;
@Override
public void populateItem(Item<ICellPopulator<ProjectIdea>> item, String componentId, IModel<ProjectIdea> rowModel) {
ProjectIdea idea = rowModel.getObject();
if(idea.getMatch().getSupervisor()!=null){
Employee supervisor = idea.getMatch().getSupervisor();
bachelorAvailability = supervisorService.getAvailability(supervisor, bachelor);
item.add(new Label(componentId, bachelorAvailability.getNumCapable()+""));
//If target numbers is supposed to be changed through this view, use this instead:
//item.add(new EmployeeProjectLimitsInputPanel(componentId, bachelorAvailability, container, feedback));
} else {
item.add(new Label(componentId,"-"));
}
}
};
columns[14] = new AbstractColumn<ProjectIdea>(Model.of("Supervisor target master")){
private static final long serialVersionUID = -2718705268854089171L;
@Override
public void populateItem(Item<ICellPopulator<ProjectIdea>> item, String componentId, IModel<ProjectIdea> rowModel) {
ProjectIdea idea = rowModel.getObject();
if(idea.getMatch().getSupervisor()!=null){
Employee supervisor = idea.getMatch().getSupervisor();
masterAvailability = supervisorService.getAvailability(supervisor, master);
item.add(new Label(componentId, masterAvailability.getNumCapable()+""));
//If target numbers is supposed to be changed through this view, use this instead:
//item.add(new EmployeeProjectLimitsInputPanel(componentId, masterAvailability, container, feedback));
} else {
item.add(new Label(componentId,"-"));
}
}
};
columns[15] = new AbstractColumn<ProjectIdea>(Model.of("Supervisor current bachelor")){
private static final long serialVersionUID = 7556136224226199136L;
@Override
public void populateItem(Item<ICellPopulator<ProjectIdea>> item, String componentId, IModel<ProjectIdea> rowModel) {
ProjectIdea idea = rowModel.getObject();
if(idea.getMatch().getSupervisor()!=null){
item.add(new Label(componentId, bachelorAvailability.getNumMatched()+""));
} else {
item.add(new Label(componentId,"-"));
}
}
};
columns[16] = new AbstractColumn<ProjectIdea>(Model.of("Supervisor current master")){
private static final long serialVersionUID = 9196927881074281835L;
@Override
public void populateItem(Item<ICellPopulator<ProjectIdea>> item, String componentId, IModel<ProjectIdea> rowModel) {
ProjectIdea idea = rowModel.getObject();
if(idea.getMatch().getSupervisor()!=null){
item.add(new Label(componentId, masterAvailability.getNumMatched()+""));
} else {
item.add(new Label(componentId,"-"));
}
}
};
return columns;
}
});
}
private class FilterForm extends Form<Void> {
private static final long serialVersionUID = 3583440875631610379L;
private String titleString;
public FilterForm(String id) {
super(id);
params = new ProjectIdeaService.FilterParams();
// DATE FILTERING
DateTime start = new DateTime();
start = start.minusMonths(12);
params.setCreatedAfter(start.toDate());
params.setCreatedBefore(new Date());
final DatePickerPanel datePanel = new DatePickerPanel("dateFilter", start.toDate(), null) {
private static final long serialVersionUID = -411662653140866688L;
@Override
public void updateStartDate(AjaxRequestTarget target) {
params.setCreatedAfter(getStartDate());
target.addComponent(genericDataPanel.getWMC());
}
@Override
public void updateEndDate(AjaxRequestTarget target) {
params.setCreatedBefore(getEndDate());
target.addComponent(genericDataPanel.getWMC());
}
};
add(datePanel);
// SUPERVISOR FILTERING
add(new EmployeeAutoComplete("supervisorFilter") {
private static final long serialVersionUID = -3364194384925083087L;
@Override
protected void action(AjaxRequestTarget pTarget, Employee newSelection) {
params.setSupervisor(newSelection);
pTarget.addComponent(genericDataPanel.getWMC());
}
});
// TITLE FILTERING
TextField<String> titleField = new TextField<String>("titleFilter", new PropertyModel<String>(this, "titleString"));
titleField.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = -4986728044099984432L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if(titleString!=null&&titleString.length() >= 3){
params.setTitleContains(titleString);
target.addComponent(genericDataPanel.getWMC());
} else {
params.setTitleContains(null);
target.addComponent(genericDataPanel.getWMC());
}
}
});
add(titleField);
// AREA FILTERING
final FilterFormAreaPanel areaFilter = new FilterFormAreaPanel("areaFilter", false) {
private static final long serialVersionUID = 8805181785173288876L;
@Override
public void ajaxUpdate(AjaxRequestTarget target) {
params.setResearchArea(getArea());
target.addComponent(genericDataPanel.getWMC());
}
};
add(areaFilter);
//UNIT FILTERING (based on supervisors unit since no units are connected to ideas
final FilterFormUnitPanel unitFilter = new FilterFormUnitPanel("unitFilter", true) {
private static final long serialVersionUID = -8806554969942119990L;
@Override
public void ajaxUpdate(AjaxRequestTarget target) {
if(getOption().equals("None")){
params.setUnit(null);
params.setNoUnit(true);
} else {
params.setUnit(getUnit());
params.setNoUnit(false);
}
target.addComponent(genericDataPanel.getWMC());
}
};
add(unitFilter);
//STATUS FILTERING
final List<Match.Status> statusList = Arrays.asList(new Match.Status[]{Match.Status.CONFIRMED, Match.Status.INACTIVE, Match.Status.REFUSED, Match.Status.REJECTED, Match.Status.UNMATCHED});
final FilterFormCheckBoxPanel<Match.Status> statusFilter = new FilterFormCheckBoxPanel<Match.Status>("statusFilter", null, "status") {
private static final long serialVersionUID = -6425599815722740075L;
@Override
public void ajaxUpdate(AjaxRequestTarget target) {
if(!getSelection().isEmpty()){
params.setStatuses(getSelection());
}
target.addComponent(genericDataPanel.getWMC()); }
@Override
protected List<Status> choices() {
return statusList;
}
};
params.setStatuses(statusFilter.getSelection());
add(statusFilter);
}
}
}

@ -9,13 +9,13 @@
<div wicket:id="wmc">
<div><b>Filter by project idea title or supervisor name:</b></div>
<div><b>Filter by project idea title or supervisor name:</b><span class="right"><a href="#" target="_blank" wicket:id="popupLink">Open student ideas administration in a new window</a></span></div>
<div wicket:id="fsp"></div>
<div><b>Filter by dates:</b></div>
<div wicket:id="dates"></div>
<div><b>Filter by status:</b></div>
<div wicket:id="statusPanel"></div>
<!--<div>Filter by title or creator:</div>-->
<!--<div wicket:id="filterStringPanel"></div>-->
<!--<div><input wicket:id="filterbox" type="checkbox"/> <span wicket:id="filterboxLabel"></span></div>-->

@ -1,12 +1,15 @@
package se.su.dsv.scipro.datatables.projectidea;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
@ -15,31 +18,30 @@ import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog;
import org.springframework.data.domain.PageRequest;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.admin.pages.match.AdminIdeaPopupPage;
import se.su.dsv.scipro.admin.panels.match.EmployeeAutoCompleteDivPanel;
import se.su.dsv.scipro.admin.panels.match.ProjectIdeaActionPanel;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.datatables.*;
import se.su.dsv.scipro.datatables.ClickableIconColumn;
import se.su.dsv.scipro.datatables.ClickableTitleColumn;
import se.su.dsv.scipro.datatables.DateColumn;
import se.su.dsv.scipro.datatables.GenericDataPanel;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.match.dao.interfaces.MatchDao;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.panel.MatchStatusFilterPanel;
import se.su.dsv.scipro.reusable.DatesPanel;
import se.su.dsv.scipro.reusable.EmployeeAutoComplete;
import se.su.dsv.scipro.reusable.FilterStringPanel;
import se.su.dsv.scipro.reusable.SafeLongToIntService;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.springdata.services.GenericService;
import se.su.dsv.scipro.springdata.services.MatchService;
import se.su.dsv.scipro.springdata.services.ProjectIdeaService;
import se.su.dsv.scipro.springdata.services.ProjectService;
import se.su.dsv.scipro.supervisor.panels.WatsonInfoPanel;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
/**
* User: fred
* Date: 6/8/12
@ -105,6 +107,22 @@ public class ProjectIdeaDataPanel extends Panel {
}
});
//POPUP PAGE LINK
wmc.add(new Link<Void>("popupLink"){
private static final long serialVersionUID = 1643452640078681127L;
@Override
public void onClick() {
setResponsePage(AdminIdeaPopupPage.class);
}
});
wmc.add(dataPanel = new GenericDataPanel<ProjectIdea>("dataTable") {
@Override
public GenericService getService() {

@ -94,6 +94,11 @@ public class AdminSupervisorIdeaCrudPanel extends Panel {
return "dateCreated";
}
@Override
public boolean getSortDirection() {
return false;
}
@Override
public IColumn[] getColumns() {
IColumn[] columns = new IColumn[8];

@ -111,7 +111,7 @@ public class ProjectIdea extends DomainObject {
private List<Match> matchHistory = new ArrayList<Match>();
@OneToOne(optional = true)
@QueryInit({"supervisor.user"})
@QueryInit({"supervisor.user","supervisor.unit"})
private Match match;
@Override

@ -26,6 +26,7 @@ import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
import se.su.dsv.scipro.match.dataobject.Idea.IdeaStatus;
import se.su.dsv.scipro.match.dataobject.SupervisorIdea;
import se.su.dsv.scipro.match.panel.FilterFormCheckBoxPanel;
import se.su.dsv.scipro.reusable.SafeLongToIntService;
import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
import se.su.dsv.scipro.springdata.services.GenericService;
import se.su.dsv.scipro.springdata.services.ProjectClassService;
@ -96,6 +97,11 @@ public class ProjectIdeaOverviewPanel extends Panel {
}
@Override
public int getSize() {
return SafeLongToIntService.safeLongToInt(ideaService.countByStatusAndCapabilities(IdeaStatus.WAITING, params));
}
@Override
public Iterator<SupervisorIdea> getIterator() {
return ideaService.findByStatusAndCapabilities(IdeaStatus.WAITING, params, new PageRequest(getTable().getCurrentPage(), getTable().getRowsPerPage(), getSort())).iterator();
}

@ -1,6 +1,7 @@
package se.su.dsv.scipro.springdata.serviceimpls;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
@ -22,12 +23,15 @@ import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
import se.su.dsv.scipro.data.dataobjects.ResearchArea;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.Unit;
import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.dataobject.ProjectIdeaFirstMeeting;
import se.su.dsv.scipro.match.dataobject.QProjectIdea;
import se.su.dsv.scipro.match.dataobject.QSupervisorIdea;
import se.su.dsv.scipro.springdata.repos.ProjectIdeaRepo;
import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
import se.su.dsv.scipro.springdata.services.GeneralSystemSettingsService;
@ -97,12 +101,25 @@ public class ProjectIdeaServiceImpl extends AbstractQueryService<ProjectIdea, Lo
return projectIdeaRepo.findAll(projectCreated(false).and(isMatchedTo(employee)).and(isMatchStatus(Match.Status.CONFIRMED)), pageable);
}
@Override
public Page<ProjectIdea> findAll(FilterParams params, Pageable pageable) {
if(params!=null)
return projectIdeaRepo.findAll(fromParams(params), pageable);
else
return projectIdeaRepo.findAll(pageable);
}
@Override
public List<ProjectIdea> findIdeasWithoutProjects() {
Iterable<ProjectIdea> iterable = projectIdeaRepo.findAll(projectCreated(false).and(isMatchStatus(Match.Status.CONFIRMED)));
return constructList(iterable);
}
@Override
public Long countAll(FilterParams params) {
return projectIdeaRepo.count(fromParams(params));
}
@Override
public Long countByAuthor(Student author) {
return projectIdeaRepo.count(isAuthor(author));
@ -206,6 +223,28 @@ public class ProjectIdeaServiceImpl extends AbstractQueryService<ProjectIdea, Lo
return reloadedIdea;
}
private BooleanBuilder fromParams(FilterParams params) {
BooleanBuilder bb = new BooleanBuilder();
if(params.getLevels()!=null)
bb.and(levelFilter(params.getLevels()));
if(params.getStatuses()!=null)
bb.and(statusFilter(params.getStatuses()));
if(params.getSupervisor()!=null)
bb.and(isMatchedTo(params.getSupervisor()));
if(params.getCreatedAfter()!=null)
bb.and(startedBetween(params.getCreatedAfter(), params.getCreatedBefore()));
if(params.getTitleContains()!=null&&params.getTitleContains().length()>=3)
bb.and(projectIdeaTitleContains(params.getTitleContains()));
if(params.getResearchArea()!=null)
bb.and(byArea(params.getResearchArea()));
if(params.getUnit()!=null)
bb.and(bySupervisorUnit(params.getUnit()));
if(params.isNoUnit())
bb.and(hasNoUnit());
System.out.println(bb.getArgs());
return bb;
}
private BooleanExpression matchDateAfter(Date matchDateAfter) {
if (matchDateAfter!=null)
return QProjectIdea.projectIdea.match.dateCreated.after(matchDateAfter);
@ -213,6 +252,22 @@ public class ProjectIdeaServiceImpl extends AbstractQueryService<ProjectIdea, Lo
return null;
}
private BooleanExpression hasNoUnit() {
return QProjectIdea.projectIdea.match.supervisor.unit.isNull();
}
private BooleanExpression byArea(ResearchArea area) {
return QProjectIdea.projectIdea.researchArea.eq(area);
}
private BooleanExpression bySupervisorUnit(Unit unit) {
return QProjectIdea.projectIdea.match.supervisor.unit.eq(unit);
}
private BooleanExpression startedBetween(Date from, Date to) {
return QProjectIdea.projectIdea.dateCreated.between(from, to);
}
private BooleanExpression projectCreated(boolean isCreated) {
if(isCreated)
return QProjectIdea.projectIdea.project.isNotNull();
@ -272,7 +327,26 @@ public class ProjectIdeaServiceImpl extends AbstractQueryService<ProjectIdea, Lo
}
}
private BooleanBuilder statusFilter(Collection<Match.Status> statuses){
Set<Match.Status> statusSet = new HashSet<Match.Status>(statuses);
return statusFilter(statusSet);
}
private BooleanBuilder levelFilter(Collection<ProjectClass> levels) {
BooleanBuilder e = new BooleanBuilder();
if(levels!=null && !levels.isEmpty()){
for (ProjectClass level : levels) {
e.or(isProjectClass(level));
}
return e;
}
else {
e.and(QProjectIdea.projectIdea.projectClass.isNull());
return e;
}
}
private BooleanExpression isMatchedTo(Employee employee){
return QProjectIdea.projectIdea.match.supervisor.eq(employee);
}

@ -530,6 +530,11 @@ public class SupervisorIdeaServiceImpl extends AbstractQueryService<SupervisorId
return supervisorIdeaRepo.count(byStatus(status).and(predicateFromParams(params)));
}
@Override
public Long countByStatusAndCapabilities(IdeaStatus status, FilterParams params) {
return supervisorIdeaRepo.count(byStatus(status).and(capabilityFilter(params.getLevels())));
}
@Override
public Long countIdeasWithoutProjects(Employee supervisor) {
return supervisorIdeaRepo.count(bySupervisor(supervisor).and(projectCreated(false)).and(byStatus(IdeaStatus.TAKEN).or(byStatus(IdeaStatus.COMPLETED))));

@ -1,5 +1,7 @@
package se.su.dsv.scipro.springdata.services;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
@ -9,7 +11,9 @@ import org.springframework.data.domain.Pageable;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ResearchArea;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.Unit;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
@ -24,9 +28,11 @@ public interface ProjectIdeaService extends GenericService<ProjectIdea,Long>, Qu
public Page<ProjectIdea> findByMatchedTo(Employee employee, Pageable pageable);
public Page<ProjectIdea> findByAuthor(Student author, Pageable pageable);
public Page<ProjectIdea> findIdeasWithoutProjects(Employee employee, Pageable pageable);
public Page<ProjectIdea> findAll(FilterParams params, Pageable pageable);
public List<ProjectIdea> findIdeasWithoutProjects();
public Long countAll(FilterParams params);
public Long countByAuthor(Student author);
public Long countActiveByAuthor(Student author);
public Long count(Set<Match.Status> statusSet, String filterString, Date fromDate, Date toDate);
@ -41,4 +47,73 @@ public interface ProjectIdeaService extends GenericService<ProjectIdea,Long>, Qu
public ProjectIdea createProject(ProjectIdea idea);
public ProjectIdea saveMeeting(ProjectIdea idea, Date date, String desc);
public static class FilterParams implements Serializable {
private static final long serialVersionUID = 2633928991852477368L;
private Date createdAfter;
private Date createdBefore;
private String titleContains;
private Employee supervisor;
private ResearchArea researchArea;
private Unit unit;
private Collection<Match.Status> statuses;
private Collection<ProjectClass> levels;
private boolean noUnit;
public void setCreatedAfter(Date createdAfter) {
this.createdAfter = createdAfter;
}
public Date getCreatedAfter() {
return createdAfter;
}
public void setCreatedBefore(Date createdBefore) {
this.createdBefore = createdBefore;
}
public Date getCreatedBefore() {
return createdBefore;
}
public void setTitleContains(String titleContains) {
this.titleContains = titleContains;
}
public String getTitleContains() {
return titleContains;
}
public void setSupervisor(Employee supervisor) {
this.supervisor = supervisor;
}
public Employee getSupervisor() {
return supervisor;
}
public void setResearchArea(ResearchArea researchArea) {
this.researchArea = researchArea;
}
public ResearchArea getResearchArea() {
return researchArea;
}
public void setUnit(Unit unit) {
this.unit = unit;
}
public Unit getUnit() {
return unit;
}
public void setNoUnit(boolean noUnit) {
this.noUnit = noUnit;
}
public boolean isNoUnit() {
return noUnit;
}
public void setStatuses(Collection<Match.Status> statuses) {
this.statuses = statuses;
}
public Collection<Match.Status> getStatuses() {
return statuses;
}
public void setLevels(Collection<ProjectClass> levels) {
this.levels = levels;
}
public Collection<ProjectClass> getLevels() {
return levels;
}
}
}

@ -32,6 +32,7 @@ public interface SupervisorIdeaService extends GenericService<SupervisorIdea, Lo
Long countIdeas(IdeaStatus status, Employee supervisor, ProjectClass pc);
Long count(FilterParams params);
Long countByStatusAndParams(IdeaStatus status, FilterParams params);
Long countByStatusAndCapabilities(IdeaStatus status, FilterParams params);
Long countIdeasWithoutProjects(Employee supervisor);
void saveSupervisorCreatedIdea(SupervisorIdea idea, Employee creator, SortedSet<Student> students, ResearchArea researchArea, Set<Keyword> keywords, boolean newIdea);

@ -11,7 +11,13 @@
</div>
<!--<div class="prepend-top span-24">-->
<div>
<div class="prepend-top">
<form wicket:id="filterForm">
<div class="span-24">
<div class="span-6" wicket:id="levelFilter"></div>
<div class="span-10" wicket:id="areaFilter"></div>
</div>
</form>
<div wicket:id="dataPanel"></div>
</div>
</wicket:extend>

@ -1,12 +1,15 @@
package se.su.dsv.scipro.supervisor.pages;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.model.IModel;
@ -18,17 +21,21 @@ import org.springframework.data.domain.PageRequest;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorProjectIdea;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.datatables.ClickableTitleColumn;
import se.su.dsv.scipro.datatables.GenericDataPanel;
import se.su.dsv.scipro.match.dao.interfaces.MatchDao;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.panel.FilterFormAreaPanel;
import se.su.dsv.scipro.match.panel.FilterFormCheckBoxPanel;
import se.su.dsv.scipro.reusable.SafeLongToIntService;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.springdata.services.EmployeeService;
import se.su.dsv.scipro.springdata.services.GenericService;
import se.su.dsv.scipro.springdata.services.ProjectClassService;
import se.su.dsv.scipro.springdata.services.ProjectIdeaService;
import se.su.dsv.scipro.supervisor.panels.WatsonInfoPanel;
@ -42,7 +49,10 @@ public class SupervisorAllStudentIdeasPage extends AbstractSupervisorProjectIdea
@SpringBean
private MatchDao matchDao;
@SpringBean
private SafeLongToIntService safeLongToIntService;
private ProjectClassService projectClassService;
private ProjectIdeaService.FilterParams params;
private GenericDataPanel<ProjectIdea> genericDataPanel;
private Dialog dialog;
public SupervisorAllStudentIdeasPage(final PageParameters pp) {
@ -58,10 +68,12 @@ public class SupervisorAllStudentIdeasPage extends AbstractSupervisorProjectIdea
dialog.add(new EmptyPanel("watson"));
dialog.add(new EmptyPanel("interestLink"));
add(dialog);
add(new FilterForm("filterForm"));
add(genericDataPanel = new GenericDataPanel<ProjectIdea>("dataPanel") {
private static final long serialVersionUID = 3608529853945788462L;
add(new GenericDataPanel<ProjectIdea>("dataPanel") {
@Override
public GenericService getService() {
@Override
public GenericService<ProjectIdea, Long> getService() {
return projectIdeaService;
}
@ -76,13 +88,17 @@ public class SupervisorAllStudentIdeasPage extends AbstractSupervisorProjectIdea
columns = new IColumn[5];
columns[0] = new PropertyColumn<ScheduleTemplate>(Model.of("Level"), "projectClass", "projectClass");
columns[1] = new ClickableTitleColumn<ProjectIdea>(Model.of("Title"), "title", "title") {
@Override
private static final long serialVersionUID = -1262998078334461130L;
@Override
protected void onClick(final IModel<ProjectIdea> clicked, AjaxRequestTarget target) {
dialog.replace(new WatsonInfoPanel("watson", clicked.getObject(), false));
AjaxLink<Void> interestLink;
dialog.replace(interestLink = new AjaxLink<Void>("interestLink") {
@Override
private static final long serialVersionUID = -4096126257468826185L;
@Override
public void onClick(AjaxRequestTarget target) {
Employee supervisor = employeeService.findByUser(getUser());
matchDao.confirmToSuperviseIdea(getUser(), supervisor, clicked.getObject().getMatch());
@ -107,16 +123,61 @@ public class SupervisorAllStudentIdeasPage extends AbstractSupervisorProjectIdea
@Override
public Iterator<ProjectIdea> getIterator() {
return projectIdeaService.find(Match.Status.UNMATCHED, new PageRequest(getTable().getCurrentPage(), getTable().getRowsPerPage(), getSort())).iterator();
//return projectIdeaService.find(Match.Status.UNMATCHED, new PageRequest(getTable().getCurrentPage(), getTable().getRowsPerPage(), getSort())).iterator();
return projectIdeaService.findAll(params, new PageRequest(getTable().getCurrentPage(), getTable().getRowsPerPage(), getSort())).iterator();
}
@Override
public int getSize() {
return safeLongToIntService.safeLongToInt(projectIdeaService.countProjectIdeaByMatchStatus(Match.Status.UNMATCHED));
return SafeLongToIntService.safeLongToInt(projectIdeaService.countAll(params));
}
});
}
private class FilterForm extends Form<Void> {
private static final long serialVersionUID = -5617866782172392049L;
public FilterForm(String id) {
super(id);
params = new ProjectIdeaService.FilterParams();
//ONLY TAKE UNMATCHED IDEAS IN PARAMS
List<Match.Status> unmatched = Arrays.asList(new Match.Status[]{Match.Status.UNMATCHED});
params.setStatuses(unmatched);
//PROJECT LEVEL FILTERING
final FilterFormCheckBoxPanel<ProjectClass> levelFilter = new FilterFormCheckBoxPanel<ProjectClass>("levelFilter", null, "level") {
private static final long serialVersionUID = -6477237173142198302L;
@Override
public void ajaxUpdate(AjaxRequestTarget target) {
if (!getSelection().isEmpty()) {
params.setLevels(getSelection());
}
target.addComponent(genericDataPanel.getWMC());
}
@Override
protected List<ProjectClass> choices() {
return projectClassService.findAllActive();
}
};
params.setLevels(levelFilter.getSelection());
add(levelFilter);
//RESEARCH AREA FILTERING
final FilterFormAreaPanel areaFilter = new FilterFormAreaPanel("areaFilter", false) {
private static final long serialVersionUID = 2213213403070359265L;
@Override
public void ajaxUpdate(AjaxRequestTarget target) {
params.setResearchArea(getArea());
target.addComponent(genericDataPanel.getWMC());
}
};
add(areaFilter);
}
}
}

@ -0,0 +1,2 @@
.container {width:2500px;margin:0;}