Merge remote-tracking branch 'origin/develop' into develop
Conflicts: src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminStatisticsPage.java src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectIdeaPage.java src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorUnmatchedProjectIdeaPage.java src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java
This commit is contained in:
commit
158c53ef7a
resources/db_update_scripts
src/main
java/se/su/dsv/scipro
admin
pages
panels
components
io/impl
match
dao
interfaces
jpa
dataobject
dataprovider
panel
project/panels
ProjectDetailsPanel.htmlProjectDetailsPanel.javaProjectManagementPanel.htmlProjectManagementPanel.java
supervisor
pages
panels
resources/META-INF
webapp/META-INF
@ -1 +1,8 @@
|
||||
ALTER TABLE general_system_settings ADD supervisorsCanAcceptDeclinePIs bit(1) NOT NULL
|
||||
CREATE TABLE `projectIdea_Employee` (
|
||||
`projectIdea_id` bigint(20) NOT NULL,
|
||||
`supervisorInterest_id` bigint(20) NOT NULL,
|
||||
KEY `FK485C987D4E31D7A1` (`projectIdea_id`),
|
||||
KEY `FK485C987DBB2259FB` (`supervisorInterest_id`),
|
||||
CONSTRAINT `FK485C987DBB2259FB` FOREIGN KEY (`supervisorInterest_id`) REFERENCES `role` (`id`),
|
||||
CONSTRAINT `FK485C987D4E31D7A1` FOREIGN KEY (`projectIdea_id`) REFERENCES `projectIdea` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
1
resources/db_update_scripts/db_update_2012-03-20.sql
Normal file
1
resources/db_update_scripts/db_update_2012-03-20.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE general_system_settings ADD supervisorsCanAcceptDeclinePIs bit(1) NOT NULL
|
@ -3,13 +3,33 @@
|
||||
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
|
||||
<body>
|
||||
<wicket:extend>
|
||||
<div class="span-22 last">
|
||||
<div wicket:id="feedbackPanel"></div>
|
||||
<div class="span-5 append-1" wicket:id="menuPanel"></div>
|
||||
<div class="span-15 last">
|
||||
<wicket:child />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!--<div class="span-22 last">-->
|
||||
<!--<div wicket:id="feedbackPanel"></div>-->
|
||||
<!--<div class="span-5 append-1" wicket:id="menuPanel"></div>-->
|
||||
<!--<div class="span-15 last">-->
|
||||
<!--<wicket:child />-->
|
||||
<!--</div>-->
|
||||
<!--</div>-->
|
||||
|
||||
|
||||
|
||||
<div class="span-22 last append-bottom">
|
||||
<div wicket:id="menuPanel"></div>
|
||||
</div>
|
||||
<div class="span-22 last">
|
||||
<div wicket:id="feedbackPanel"></div>
|
||||
<wicket:child />
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</wicket:extend>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,44 +1,43 @@
|
||||
package se.su.dsv.scipro.admin.pages;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.PageParameters;
|
||||
import org.apache.wicket.markup.html.panel.FeedbackPanel;
|
||||
|
||||
import se.su.dsv.scipro.admin.pages.match.AdminSupervisorKeywordsPage;
|
||||
import se.su.dsv.scipro.components.AbstractMenuPanel;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
|
||||
@Authorization(authorizedRoles = { Roles.ADMIN })
|
||||
public abstract class AbstractAdminStatisticsPage extends AbstractAdminPage {
|
||||
private Component feedBackPanel;
|
||||
|
||||
public Component getFeedBackPanel() {
|
||||
return feedBackPanel;
|
||||
}
|
||||
|
||||
public AbstractAdminStatisticsPage(PageParameters pp) {
|
||||
super(pp);
|
||||
add(feedBackPanel = new FeedbackPanel("feedbackPanel").setOutputMarkupId(true));
|
||||
add(new AbstractMenuPanel("menuPanel", AbstractAdminStatisticsPage.class, this.getClass()){
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
protected List<MenuItem> getItemList() {
|
||||
final List<MenuItem> items = new ArrayList<MenuItem>();
|
||||
items.add(new MenuItem("Supervisor keywords", AdminSupervisorKeywordsPage.class));
|
||||
items.add(new MenuItem("Project ideas", AdminProjectIdeaStatisticPage.class));
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MenuType getMenuType() {
|
||||
return MenuType.VERTICAL;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
package se.su.dsv.scipro.admin.pages;
|
||||
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.PageParameters;
|
||||
import org.apache.wicket.markup.html.panel.FeedbackPanel;
|
||||
import se.su.dsv.scipro.admin.pages.match.AdminSupervisorKeywordsPage;
|
||||
import se.su.dsv.scipro.components.AbstractMenuPanel;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Authorization(authorizedRoles = { Roles.ADMIN })
|
||||
public abstract class AbstractAdminStatisticsPage extends AbstractAdminPage {
|
||||
private Component feedBackPanel;
|
||||
|
||||
public Component getFeedBackPanel() {
|
||||
return feedBackPanel;
|
||||
}
|
||||
|
||||
public AbstractAdminStatisticsPage(PageParameters pp) {
|
||||
super(pp);
|
||||
add(feedBackPanel = new FeedbackPanel("feedbackPanel").setOutputMarkupId(true));
|
||||
add(new AbstractMenuPanel("menuPanel", AbstractAdminStatisticsPage.class, this.getClass()){
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
protected List<MenuItem> getItemList() {
|
||||
final List<MenuItem> items = new ArrayList<MenuItem>();
|
||||
items.add(new MenuItem("Supervisor keywords", AdminSupervisorKeywordsPage.class));
|
||||
items.add(new MenuItem("Application periods", AdminProjectIdeaStatisticPage.class));
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MenuType getMenuType() {
|
||||
return MenuType.HORIZONTAL;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
@ -4,7 +4,7 @@
|
||||
<body>
|
||||
<wicket:extend>
|
||||
<h5 class="peer-title">Statistics</h5>
|
||||
Available statistics can be found in the menu to the left.
|
||||
Available statistics can be found in the menu.
|
||||
<div wicket:id="statisticsPanel" class="prepend-top"></div>
|
||||
</wicket:extend>
|
||||
</body>
|
||||
|
@ -6,11 +6,9 @@ import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
|
||||
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.Button;
|
||||
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.FeedbackPanel;
|
||||
import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.markup.repeater.Item;
|
||||
import org.apache.wicket.markup.repeater.data.DataView;
|
||||
@ -19,6 +17,7 @@ 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.data.dao.interfaces.Dao.SortableParams;
|
||||
import se.su.dsv.scipro.dataproviders.QueryableDataProvider;
|
||||
import se.su.dsv.scipro.icons.ImageObject;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ExemptionDao;
|
||||
@ -34,19 +33,18 @@ public class AdminExemptionPanel extends Panel {
|
||||
private DataView<Exemption> dataView;
|
||||
private WebMarkupContainer container;
|
||||
|
||||
@SpringBean
|
||||
private ExemptionDao exemptionDao;
|
||||
|
||||
public AdminExemptionPanel(String id) {
|
||||
@SpringBean
|
||||
private ExemptionDao exemptionDao;
|
||||
|
||||
public AdminExemptionPanel(String id) {
|
||||
super(id);
|
||||
TextField<String> searchField =
|
||||
TextField<String> searchField =
|
||||
new TextField<String>("searchField", new PropertyModel<String>(
|
||||
this, "userSearch"));
|
||||
container = new WebMarkupContainer("container");
|
||||
container.setOutputMarkupId(true);
|
||||
|
||||
OnChangeAjaxBehavior userSearchTextBehaviour =
|
||||
new OnChangeAjaxBehavior() {
|
||||
OnChangeAjaxBehavior userSearchTextBehaviour = new OnChangeAjaxBehavior() {
|
||||
|
||||
private static final long serialVersionUID =
|
||||
-3243439315735164519L;
|
||||
@ -54,13 +52,12 @@ public class AdminExemptionPanel extends Panel {
|
||||
@Override
|
||||
protected void onUpdate(AjaxRequestTarget target) {
|
||||
updateListView(container);
|
||||
container.add(dataView);
|
||||
container.add(new PagingNavigator("pagingNavigator",
|
||||
container.add(dataView);
|
||||
container.add(new PagingNavigator("pagingNavigator",
|
||||
dataView));
|
||||
target.addComponent(container);
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
final Dialog dialog = new Dialog("dialog");
|
||||
dialog.setModal(true);
|
||||
dialog.setAutoOpen(false);
|
||||
@ -87,53 +84,50 @@ public class AdminExemptionPanel extends Panel {
|
||||
searchField.add(userSearchTextBehaviour);
|
||||
add(searchField);
|
||||
updateListView(container);
|
||||
|
||||
container.add(dataView);
|
||||
container.add(dataView);
|
||||
container.add(new PagingNavigator("pagingNavigator", dataView));
|
||||
add(container);
|
||||
container.add(new PagingNavigator("pagingNavigator", dataView));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void updateListView(final WebMarkupContainer container) {
|
||||
container.removeAll();
|
||||
ExemptionDaoParams exemptionDaoParams = new ExemptionDaoParams();
|
||||
if (userSearch != null) {
|
||||
ExemptionDaoParams exemptionDaoParams = new ExemptionDaoParams();
|
||||
exemptionDaoParams.setSortOn("dateCreated", SortableParams.Sort.DESCENDING);
|
||||
if (userSearch != null) {
|
||||
if (userSearch.length() >= 3) {
|
||||
exemptionDaoParams.setAuthorNameLike(userSearch);
|
||||
}
|
||||
}
|
||||
loadUserDataView(new QueryableDataProvider<Exemption, ExemptionDaoParams>(
|
||||
exemptionDao, exemptionDaoParams));
|
||||
loadUserDataView(new QueryableDataProvider<Exemption, ExemptionDaoParams>(
|
||||
exemptionDao,exemptionDaoParams));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
public void loadUserDataView(IDataProvider<Exemption> exemptionDataProvider) {
|
||||
dataView = new DataView<Exemption>("listView", exemptionDataProvider, 10) {
|
||||
public void loadUserDataView(IDataProvider<Exemption> exemptionDataProvider) {
|
||||
dataView = new DataView<Exemption>("listView", exemptionDataProvider, 8){
|
||||
|
||||
private static final long serialVersionUID =
|
||||
2828792237574112923L;
|
||||
|
||||
@Override
|
||||
protected void populateItem(Item<Exemption> item) {
|
||||
final Exemption excemption = item.getModelObject();
|
||||
item.add(new Label("name", excemption.getAuthor().getUser()
|
||||
protected void populateItem(final Item<Exemption> item) {
|
||||
final Exemption exemption = item.getModelObject();
|
||||
item.add(new Label("name", exemption.getAuthor().getUser()
|
||||
.getFullName()));
|
||||
item.add(new Label("mail", excemption.getAuthor().getUser().getEmailAddress()));
|
||||
item.add(new Label("level", excemption.getProjectClass()
|
||||
item.add(new Label("mail", exemption.getAuthor().getUser().getEmailAddress()));
|
||||
item.add(new Label("level", exemption.getProjectClass()
|
||||
.getName()));
|
||||
item.add(new Label("comment", excemption.getComment()));
|
||||
item.add(new Label("grantedBy", excemption.getGrantedBy()
|
||||
item.add(new Label("comment", exemption.getComment()));
|
||||
item.add(new Label("grantedBy", exemption.getGrantedBy()
|
||||
.getFullName()));
|
||||
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
|
||||
item.add(new Label("dateOfGranting", formatter.format(excemption.getDateCreated())));
|
||||
|
||||
item.add(new Label("dateOfGranting", formatter.format(exemption.getDateCreated())));
|
||||
AjaxLink<Void> removeLink = new AjaxLink<Void>("removeLink"){
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
exemptionDao.delete(exemptionDao.reLoad(excemption));
|
||||
exemptionDao.delete(exemptionDao.reLoad(exemption));
|
||||
info("Revoked exemption");
|
||||
target.addComponent(container);
|
||||
target.addComponent(getPage().get("feedbackPanel"));
|
||||
@ -142,10 +136,7 @@ public class AdminExemptionPanel extends Panel {
|
||||
item.add(removeLink);
|
||||
removeLink.add(new ImageObject("removeIcon", ImageObject.SIXTEEN + ImageObject.DELETE));
|
||||
removeLink.add(new JavascriptEventConfirmation("onclick", "Are you sure you want to remove this?"));
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -87,6 +87,10 @@ public abstract class AdminEditProject extends Panel {
|
||||
public void action(AjaxRequestTarget pTarget, Employee newSelection) {
|
||||
//do nothing
|
||||
}
|
||||
@Override
|
||||
protected String getName(Employee item) {
|
||||
return item.getNameAsString();
|
||||
}
|
||||
});
|
||||
headsupervisorField.setModelObject(model.getObject().getHeadSupervisor());
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
<table class="rounded-corner">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="rounded-left-top">Application period</th><th>End date</th><th>Number of students</th>
|
||||
<th class="rounded-left-top">Application period</th><th>End date</th><th>Number of students</th><th>Number of project ideas</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -16,11 +16,12 @@
|
||||
<td wicket:id="applicationPeriodName"></td>
|
||||
<td wicket:id="applicationPeriodEndDate"></td>
|
||||
<td wicket:id="numberOfStudents"></td>
|
||||
<td wicket:id="numberOfPIs"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="5" class="rounded-foot"> </td>
|
||||
<td colspan="6" class="rounded-foot"> </td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
@ -1,7 +1,5 @@
|
||||
package se.su.dsv.scipro.admin.panels;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.basic.Label;
|
||||
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
|
||||
@ -9,12 +7,13 @@ import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.markup.repeater.Item;
|
||||
import org.apache.wicket.markup.repeater.data.DataView;
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ApplicationPeriodDao;
|
||||
import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
import se.su.dsv.scipro.match.dataprovider.ProjectIdeaStatisticDataProvider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class AdminProjectIdeaStatisticPanel extends Panel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -61,13 +60,15 @@ public class AdminProjectIdeaStatisticPanel extends Panel {
|
||||
protected void populateItem(Item<ApplicationPeriod> item) {
|
||||
List<ProjectIdea> projectIdeas = applicationPeriodDao.getProjectIdeas(item.getModelObject());
|
||||
int students = 0;
|
||||
int projectIdeasNo = 0;
|
||||
for (ProjectIdea pi : projectIdeas){
|
||||
students += pi.getAuthors().size();
|
||||
projectIdeasNo ++;
|
||||
}
|
||||
item.add(new Label("applicationPeriodName", ""+item.getModelObject().getName()));
|
||||
item.add(new Label("applicationPeriodEndDate", ""+item.getModelObject().getEndDate()));
|
||||
item.add(new Label("numberOfStudents", ""+students));
|
||||
|
||||
item.add(new Label("numberOfPIs", ""+projectIdeasNo));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -41,32 +41,40 @@ public class ManualMatchPanel extends Panel {
|
||||
|
||||
private Fragment currentFragment;
|
||||
private Fragment alternateFragment;
|
||||
private AutoCompleteObjectField<Employee, Long> autoCompleteObjectField;
|
||||
|
||||
private final ConfirmerAjaxSubmitLink saveButton;
|
||||
|
||||
public ManualMatchPanel(String id, final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status) {
|
||||
super(id);
|
||||
Component localFeedback = new FeedbackPanel("localFeedback");
|
||||
ConfirmerAjaxSubmitLink saveButton = createSubmitLink(matchModel, feedbackPanel, status, localFeedback);
|
||||
autoCompleteObjectField = createDsvAutocompleteComponent(matchModel.getObject().getProjectIdea(), status, saveButton);
|
||||
AutoCompleteObjectField<Employee, Long> autoCompleteObjectField =
|
||||
createDsvAutocompleteComponent(matchModel.getObject().getProjectIdea(), status);
|
||||
autoCompleteObjectField.setOutputMarkupId(true);
|
||||
saveButton = createSubmitLink(matchModel, feedbackPanel, status, localFeedback, autoCompleteObjectField);
|
||||
saveButton.setOutputMarkupId(true);
|
||||
setOutputMarkupPlaceholderTag(true);
|
||||
Form<Employee> matchForm = new Form<Employee>("matchForm");
|
||||
currentFragment = createButtonFragment(status, matchForm);
|
||||
currentFragment = createButtonFragment(status, matchForm, autoCompleteObjectField);
|
||||
currentFragment.setOutputMarkupId(true);
|
||||
alternateFragment = createMatchFragment(saveButton, matchForm, localFeedback);
|
||||
alternateFragment = createMatchFragment(matchForm, localFeedback, autoCompleteObjectField);
|
||||
alternateFragment.setOutputMarkupId(true);
|
||||
add(currentFragment);
|
||||
}
|
||||
|
||||
private boolean testACInputString(AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
|
||||
return autocompleteReviewerField.getModelObject() == null ||
|
||||
autocompleteReviewerField.getInput() == null ||
|
||||
autocompleteReviewerField.getInput().isEmpty() ||
|
||||
!autocompleteReviewerField.getInput().equals(autocompleteReviewerField.getModelObject().getNameAsString());
|
||||
}
|
||||
|
||||
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status, final Component localFeedback) {
|
||||
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status,
|
||||
final Component localFeedback, final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField) {
|
||||
return new ConfirmerAjaxSubmitLink("saveButton") {
|
||||
|
||||
private static final long serialVersionUID = -1820883998549197409L;
|
||||
|
||||
@Override
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
if(autoCompleteObjectField.getModelObject() == null) {
|
||||
Session.get().info("No match could be created because the supervisor was incorrect.");
|
||||
if(testACInputString(autoCompleteObjectField)) {
|
||||
Session.get().error("No match could be created because the input was invalid.");
|
||||
target.addComponent(localFeedback);
|
||||
} else {
|
||||
matchModel.getObject().setSupervisor(autoCompleteObjectField.getModelObject() != null ? autoCompleteObjectField.getModelObject():null);
|
||||
@ -84,10 +92,16 @@ public class ManualMatchPanel extends Panel {
|
||||
super.onError(target, form);
|
||||
target.addComponent(feedbackPanel); // is only activated on "this"
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDisplayConfirmation() {
|
||||
return saveButton.getMessageContentHTML() != null && !saveButton.getMessageContentHTML().isEmpty();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Fragment createButtonFragment(final Match.Status status, final Form<Employee> matchForm) {
|
||||
private Fragment createButtonFragment(final Match.Status status, final Form<Employee> matchForm,
|
||||
final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField) {
|
||||
Fragment buttonFragment = new Fragment("main", "buttonFragment", this) {
|
||||
|
||||
private static final long serialVersionUID = 2699118307386334814L;
|
||||
@ -105,9 +119,7 @@ public class ManualMatchPanel extends Panel {
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
swapFragment();
|
||||
if (target != null) {
|
||||
target.addComponent(currentFragment);
|
||||
}
|
||||
clearInputAndAddToTarget(target, autoCompleteObjectField);
|
||||
}
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
@ -121,9 +133,7 @@ public class ManualMatchPanel extends Panel {
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
swapFragment();
|
||||
if (target != null) {
|
||||
target.addComponent(currentFragment);
|
||||
}
|
||||
clearInputAndAddToTarget(target, autoCompleteObjectField);
|
||||
}
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
@ -135,7 +145,25 @@ public class ManualMatchPanel extends Panel {
|
||||
return buttonFragment;
|
||||
}
|
||||
|
||||
private Fragment createMatchFragment(final ConfirmerAjaxSubmitLink saveButton, final Form<Employee> matchForm, Component localFeedback) {
|
||||
|
||||
private void clearInputAndAddToTarget(AjaxRequestTarget target, final AutoCompleteObjectField autoCompleteObjectField) {
|
||||
//noinspection unchecked
|
||||
autoCompleteObjectField.setModelObject(null);
|
||||
autoCompleteObjectField.clearInput();
|
||||
saveButton.setMessageContentHTML(null);
|
||||
target.addComponent(currentFragment);
|
||||
target.addComponent(autoCompleteObjectField);
|
||||
target.addComponent(saveButton);
|
||||
}
|
||||
|
||||
private void swapFragment() {
|
||||
Fragment tempFragment = currentFragment;
|
||||
currentFragment.replaceWith(alternateFragment);
|
||||
currentFragment = alternateFragment;
|
||||
alternateFragment = tempFragment;
|
||||
}
|
||||
|
||||
private Fragment createMatchFragment(final Form<Employee> matchForm, Component localFeedback, final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField ) {
|
||||
Fragment matchFragment = new Fragment("main", "matchFragment", this) {
|
||||
private static final long serialVersionUID = -7770434904843562942L;
|
||||
|
||||
@ -146,22 +174,16 @@ public class ManualMatchPanel extends Panel {
|
||||
}
|
||||
};
|
||||
autoCompleteObjectField.setModelObject(null);
|
||||
|
||||
saveButton.setOutputMarkupId(true);
|
||||
localFeedback.setOutputMarkupId(true);
|
||||
matchForm.add(localFeedback);
|
||||
matchForm.add(autoCompleteObjectField);
|
||||
matchForm.add(saveButton);
|
||||
matchForm.add(new AjaxFallbackLink<Object>("cancelButton") {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
swapFragment();
|
||||
if (target != null) {
|
||||
target.addComponent(currentFragment);
|
||||
}
|
||||
clearInputAndAddToTarget(target, autoCompleteObjectField);
|
||||
}
|
||||
});
|
||||
matchFragment.add(matchForm);
|
||||
@ -169,7 +191,7 @@ public class ManualMatchPanel extends Panel {
|
||||
return matchFragment;
|
||||
}
|
||||
|
||||
public AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final Match.Status status, final ConfirmerAjaxSubmitLink saveButton) {
|
||||
AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final Match.Status status) {
|
||||
return new AutoCompleteObjectField<Employee, Long>("autoComplete", Employee.class) {
|
||||
private static final long serialVersionUID = 7734889540424308421L;
|
||||
|
||||
@ -210,7 +232,6 @@ public class ManualMatchPanel extends Panel {
|
||||
super.onNewSelection(pTarget, newSelection);
|
||||
if (newSelection != null) {
|
||||
if (pTarget != null) {
|
||||
|
||||
final String declineMessage = createDeclineMessage(newSelection.getUser(), projectIdea, status);
|
||||
if(declineMessage != null && !declineMessage.isEmpty()) {
|
||||
saveButton.setMessageContentHTML(declineMessage);
|
||||
@ -225,20 +246,13 @@ public class ManualMatchPanel extends Panel {
|
||||
};
|
||||
}
|
||||
|
||||
private void swapFragment() {
|
||||
Fragment tempFragment = currentFragment;
|
||||
currentFragment.replaceWith(alternateFragment);
|
||||
currentFragment = alternateFragment;
|
||||
alternateFragment = tempFragment;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return a match message that an employee was matched or suggested to a project idea .
|
||||
* @param employeeName the employee
|
||||
* @param projectIdeaTitle from which we get the match history
|
||||
* @param status the status
|
||||
* @return String the confirmation message
|
||||
* This method is used to return a match message that the employee was matched or suggested to supervise the project idea .
|
||||
* @param employeeName the name of the employee
|
||||
* @param projectIdeaTitle the title of the project idea
|
||||
* @param status the status of the match
|
||||
* @return String the match message
|
||||
*/
|
||||
private String createMatchMessage(final String employeeName, final String projectIdeaTitle, Match.Status status) {
|
||||
StringBuilder messageStr = new StringBuilder();
|
||||
@ -256,10 +270,10 @@ public class ManualMatchPanel extends Panel {
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return a decline message if an employee already has declined a Match between the employee and a specific project idea .
|
||||
* This method is used to return a decline message if an employee already has declined to supervise the project idea .
|
||||
* @param supervisor the employee
|
||||
* @param projectIdea from which we get the match history
|
||||
* @param status the status
|
||||
* @param projectIdea the project idea (from which we get the match history)
|
||||
* @param status the status of the match
|
||||
* @return String the decline message
|
||||
*/
|
||||
private String createDeclineMessage(User supervisor, ProjectIdea projectIdea, Match.Status status) {
|
||||
@ -285,10 +299,10 @@ public class ManualMatchPanel extends Panel {
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return a confirmation message that you want to create a match between the employee and a specific project idea .
|
||||
* This method is used to return a confirmation message (is shown in a confirmation dialog) for a match between the employee and the project idea .
|
||||
* @param supervisor the employee
|
||||
* @param status the status
|
||||
* @return String the decline message
|
||||
* @param status the status of the match
|
||||
* @return String the confirmation message
|
||||
*/
|
||||
private String createConfirmationMessage(User supervisor, Match.Status status) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
|
@ -32,28 +32,39 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
|
||||
private Fragment currentFragment;
|
||||
private Fragment alternateFragment;
|
||||
private AutoCompleteObjectField<Employee, Long> autocompleteReviewerField;
|
||||
private final ConfirmerAjaxSubmitLink saveButton;
|
||||
|
||||
public ManualSetReviewerPanel(String id, IModel<ProjectIdea> projectIdeaModel, Component feedbackPanel) {
|
||||
super(id);
|
||||
Component localFeedback = new FeedbackPanel("localFeedback");
|
||||
ConfirmerAjaxSubmitLink saveButton = createSubmitLink(projectIdeaModel, feedbackPanel, localFeedback);
|
||||
autocompleteReviewerField = createDsvAutocompleteComponent(projectIdeaModel.getObject(), saveButton);
|
||||
setOutputMarkupPlaceholderTag(true);
|
||||
Component localFeedback = new FeedbackPanel("localFeedback");
|
||||
AutoCompleteObjectField<Employee, Long> autocompleteReviewerField = createDsvAutocompleteComponent(projectIdeaModel.getObject());
|
||||
autocompleteReviewerField.setOutputMarkupId(true);
|
||||
saveButton = createSubmitLink(projectIdeaModel, feedbackPanel, localFeedback, autocompleteReviewerField);
|
||||
saveButton.setOutputMarkupId(true);
|
||||
Form<Employee> reviewerForm = new Form<Employee>("reviewerForm");
|
||||
currentFragment = createButtonFragment(reviewerForm);
|
||||
alternateFragment = createReviewerFragment(saveButton, reviewerForm, localFeedback);
|
||||
currentFragment = createButtonFragment(reviewerForm, autocompleteReviewerField);
|
||||
alternateFragment = createReviewerFragment(reviewerForm, localFeedback, autocompleteReviewerField );
|
||||
add(currentFragment);
|
||||
}
|
||||
|
||||
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel, final Component localFeedback) {
|
||||
private boolean testACInputString(AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
|
||||
return autocompleteReviewerField.getModelObject() == null ||
|
||||
autocompleteReviewerField.getInput() == null ||
|
||||
autocompleteReviewerField.getInput().isEmpty() ||
|
||||
!autocompleteReviewerField.getInput().equals(autocompleteReviewerField.getModelObject().getNameAsString());
|
||||
}
|
||||
|
||||
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel,
|
||||
final Component localFeedback, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
|
||||
return new ConfirmerAjaxSubmitLink("saveButton") {
|
||||
|
||||
private static final long serialVersionUID = -1852298712407811714L;
|
||||
|
||||
@Override
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
if(autocompleteReviewerField.getModelObject() == null) {
|
||||
Session.get().info("No match could be created because the reviewer was incorrect.");
|
||||
if(testACInputString(autocompleteReviewerField) ) {
|
||||
Session.get().error("No reviewer could be selected because the input was invalid.");
|
||||
target.addComponent(localFeedback);
|
||||
} else {
|
||||
ProjectIdea projectIdea = projectIdeaModel.getObject();
|
||||
@ -67,17 +78,22 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
|
||||
@Override //Listener method invoked on form submit with errors
|
||||
protected void onError(AjaxRequestTarget target, Form<?> form) {
|
||||
error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString()));
|
||||
Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString()));
|
||||
super.onError(target, form);
|
||||
setResponsePage(AdminManageProjectIdeaPage.class);
|
||||
target.addComponent(feedbackPanel); // is only activated on "this"
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDisplayConfirmation() {
|
||||
return saveButton.getMessageContentHTML() != null && !saveButton.getMessageContentHTML().isEmpty();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
private Fragment createButtonFragment(final Form<Employee> reviewerForm) {
|
||||
private Fragment createButtonFragment(final Form<Employee> reviewerForm, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
|
||||
Fragment buttonFragment = new Fragment("main", "buttonFragment", this) {
|
||||
private static final long serialVersionUID = 2383077895140299047L;
|
||||
|
||||
@ -88,22 +104,28 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
}
|
||||
};
|
||||
buttonFragment.add(new AjaxFallbackLink<Object>("manualSetReviewerButton") {
|
||||
|
||||
private static final long serialVersionUID = 5843396419011530582L;
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
swapFragment();
|
||||
if (target != null) {
|
||||
target.addComponent(currentFragment);
|
||||
}
|
||||
clearInputAndAddToTarget(target, autocompleteReviewerField);
|
||||
}
|
||||
});
|
||||
buttonFragment.setOutputMarkupPlaceholderTag(true);
|
||||
return buttonFragment;
|
||||
}
|
||||
|
||||
private Fragment createReviewerFragment(ConfirmerAjaxSubmitLink saveButton, final Form<Employee> reviewerForm, Component localFeedback) {
|
||||
private void clearInputAndAddToTarget(AjaxRequestTarget target, final AutoCompleteObjectField autoCompleteObjectField) {
|
||||
//noinspection unchecked
|
||||
autoCompleteObjectField.setModelObject(null);
|
||||
autoCompleteObjectField.clearInput();
|
||||
saveButton.setMessageContentHTML(null);
|
||||
target.addComponent(currentFragment);
|
||||
target.addComponent(autoCompleteObjectField);
|
||||
target.addComponent(saveButton);
|
||||
}
|
||||
|
||||
private Fragment createReviewerFragment(final Form<Employee> reviewerForm, Component localFeedback, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
|
||||
Fragment reviewerFragment = new Fragment("main", "reviewerFragment", this) {
|
||||
|
||||
private static final long serialVersionUID = -1831632235479216987L;
|
||||
@ -115,23 +137,18 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
}
|
||||
};
|
||||
autocompleteReviewerField.setModelObject(null);
|
||||
|
||||
reviewerForm.add(autocompleteReviewerField);
|
||||
saveButton.setOutputMarkupId(true);
|
||||
|
||||
localFeedback.setOutputMarkupId(true);
|
||||
reviewerForm.add(localFeedback);
|
||||
reviewerForm.add(saveButton);
|
||||
reviewerForm.add(new AjaxFallbackLink<Object>("cancelButton") {
|
||||
|
||||
private static final long serialVersionUID = 5413209640805412939L;
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
swapFragment();
|
||||
if (target != null) {
|
||||
target.addComponent(currentFragment);
|
||||
}
|
||||
clearInputAndAddToTarget(target, autocompleteReviewerField);
|
||||
}
|
||||
});
|
||||
reviewerFragment.add(reviewerForm);
|
||||
@ -139,7 +156,7 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
return reviewerFragment;
|
||||
}
|
||||
|
||||
public AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final ConfirmerAjaxSubmitLink saveButton) {
|
||||
AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea) {
|
||||
return new AutoCompleteObjectField<Employee, Long>("reviewerTextField", Employee.class) {
|
||||
private static final long serialVersionUID = 8639430940925886127L;
|
||||
|
||||
@ -187,31 +204,56 @@ public class ManualSetReviewerPanel extends Panel {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private String getConfirmMessage(String employeeName, String projectIdeaTitle) {
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return an confirmation message (is shown in a confirmation dialog)
|
||||
* to the administrator, that the employee really should be suggested as a reviewer for the project idea.
|
||||
* @param projectIdeaTitle the title of the project idea
|
||||
* @param reviewerName the name of the suggested reviewer
|
||||
* @return String the confirmation message
|
||||
*/
|
||||
private String getConfirmMessage(final String projectIdeaTitle, final String reviewerName) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("Are you sure that you want to suggest ");
|
||||
stringBuilder.append(employeeName);
|
||||
stringBuilder.append(reviewerName);
|
||||
stringBuilder.append(" as reviewer for the project idea ");
|
||||
stringBuilder.append(projectIdeaTitle);
|
||||
stringBuilder.append("?");
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
private String getInfoMessage(String projectIdeaTitle, String reviewerName) {
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return an information message that the employee was suggested as a reviewer for the project idea.
|
||||
* @param projectIdeaTitle the title of the project idea
|
||||
* @param reviewerName the name of the suggested reviewer
|
||||
* @return String the information message
|
||||
*/
|
||||
private String getInfoMessage(final String projectIdeaTitle, final String reviewerName) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append(reviewerName);
|
||||
stringBuilder.append(" was suggested reviewer for the project idea ");
|
||||
stringBuilder.append(projectIdeaTitle);
|
||||
stringBuilder.append(".");
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* This method is used to return an error message which is shown in case of an unforeseen error.
|
||||
* @param projectIdeaTitle the title of the project idea
|
||||
* @param reviewerName the name of the presumed reviewer
|
||||
* @return String the error message
|
||||
*/
|
||||
private String getErrorMessage(String projectIdeaTitle, String reviewerName) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("An error occurred when suggesting ");
|
||||
stringBuilder.append(reviewerName);
|
||||
stringBuilder.append(" as reviewer for the project idea ");
|
||||
stringBuilder.append(projectIdeaTitle);
|
||||
stringBuilder.append(".");
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
package se.su.dsv.scipro.components;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.markup.html.form.DropDownChoice;
|
||||
import org.apache.wicket.model.Model;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class ItemsPerPageChoice extends DropDownChoice<Integer> {
|
||||
|
||||
@ -19,7 +19,7 @@ public class ItemsPerPageChoice extends DropDownChoice<Integer> {
|
||||
|
||||
|
||||
private void initChoices() {
|
||||
List<Integer> choices = Arrays.asList(new Integer[]{10, 25, 50, 100});
|
||||
List<Integer> choices = Arrays.asList(new Integer[]{10, 25, 50, 100, 1000});
|
||||
setChoices(choices);
|
||||
setNullValid(false);
|
||||
setRequired(true);
|
||||
|
@ -465,7 +465,7 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
|
||||
final Set<ProjectParticipantDTO> fetchedOtherParticipants = fetchParticipants(new HashMap<String, String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
|
||||
@Override
|
||||
String process(String url){
|
||||
return(url+"/thesis/"+projectDTO.id+"/supervisor");
|
||||
return(url+"/thesis/"+projectDTO.id+"/contributor");
|
||||
}
|
||||
});
|
||||
combinedSet.addAll(fetchedOtherParticipants);
|
||||
|
@ -18,9 +18,10 @@ public interface KeywordDao extends LazyDeleteDao<Keyword>{
|
||||
* Returns the keyword if it is found
|
||||
* @param keywordType the keyword can be of a specific type i.e. regular, research area or unit, is never NULL
|
||||
* @param keywordName the search term, can only be a part of the keyword name, but must start with the same characters
|
||||
* @param includeDeleted if deleted keywords should be included the search
|
||||
* @return List<Keyword> the keyword list
|
||||
*/
|
||||
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName);
|
||||
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName, boolean includeDeleted);
|
||||
|
||||
public List<Keyword> findAllFromType(KeywordType kt, boolean includeDeleted);
|
||||
|
||||
|
@ -52,6 +52,16 @@ public interface ProjectIdeaDao extends Dao<ProjectIdea> {
|
||||
|
||||
private Collection<Keyword> keywords;
|
||||
|
||||
private boolean includeDeleted = false;
|
||||
|
||||
public boolean isIncludeDeleted() {
|
||||
return includeDeleted;
|
||||
}
|
||||
|
||||
public void setIncludeDeleted(boolean includeDeleted) {
|
||||
this.includeDeleted = includeDeleted;
|
||||
}
|
||||
|
||||
public Collection<Keyword> getKeywords() {
|
||||
return keywords;
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import org.springframework.orm.jpa.JpaCallback;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import se.su.dsv.scipro.data.dao.jpa.AbstractQuerySet;
|
||||
import se.su.dsv.scipro.data.dao.jpa.AbstractSortableQuerySet;
|
||||
import se.su.dsv.scipro.data.dao.jpa.Query;
|
||||
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
|
||||
import se.su.dsv.scipro.data.dataobjects.Student;
|
||||
@ -47,11 +47,11 @@ public class ExemptionDaoJPAImp extends QueryableDaoJPAImp<Exemption, ExemptionD
|
||||
});
|
||||
}
|
||||
|
||||
public AbstractQuerySet<Exemption> createQuerySet(ExemptionDaoParams exemptionDaoParams) {
|
||||
return new QuerySet().authorNameLike(exemptionDaoParams.getAuthorNameLike());
|
||||
public AbstractSortableQuerySet<Exemption> createQuerySet(ExemptionDaoParams exemptionDaoParams) {
|
||||
return new QuerySet().authorNameLike(exemptionDaoParams.getAuthorNameLike()).sort(exemptionDaoParams);
|
||||
}
|
||||
|
||||
public static class QuerySet extends AbstractQuerySet<Exemption> {
|
||||
public static class QuerySet extends AbstractSortableQuerySet<Exemption> {
|
||||
|
||||
public QuerySet() {
|
||||
super(Exemption.class);
|
||||
|
@ -138,14 +138,22 @@ public class KeywordDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Keyword> imple
|
||||
}
|
||||
|
||||
@Override
|
||||
// TODO should be improved so that it is possible to search on "mining" and find "data mining"
|
||||
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName) {
|
||||
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName, final boolean includeDeleted) {
|
||||
return getJpaTemplate().execute(new JpaCallback<List<Keyword>>() {
|
||||
public List<Keyword> doInJpa(EntityManager em) throws PersistenceException {
|
||||
TypedQuery<Keyword> query;
|
||||
query = em.createQuery("SELECT x FROM "+domainClassString+" x WHERE x.type = :type AND x.keyword LIKE :keywordName ORDER BY keyword", domainClass);
|
||||
StringBuilder sqlBuilder = new StringBuilder();
|
||||
sqlBuilder.append("SELECT x FROM ").append(domainClassString).append(" x ")
|
||||
.append("WHERE x.type = :type AND x.keyword LIKE :keywordName AND ");
|
||||
if(includeDeleted) {
|
||||
sqlBuilder.append("(x.deleted = 1 OR x.deleted = 0) ");
|
||||
} else {
|
||||
sqlBuilder.append("x.deleted = 0 ");
|
||||
}
|
||||
sqlBuilder.append("ORDER BY keyword ");
|
||||
query = em.createQuery(sqlBuilder.toString(), domainClass);
|
||||
query.setParameter("type", keywordType);
|
||||
String keyWordNameString = keywordName + "%";
|
||||
String keyWordNameString = "%" + keywordName + "%";
|
||||
query.setParameter("keywordName", keyWordNameString);
|
||||
query.setHint(QueryHints.HINT_CACHEABLE, "true");
|
||||
return query.getResultList();
|
||||
|
@ -16,6 +16,7 @@ import se.su.dsv.scipro.data.dataobjects.Employee;
|
||||
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
|
||||
import se.su.dsv.scipro.data.dataobjects.Student;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
|
||||
import se.su.dsv.scipro.match.dataobject.Keyword;
|
||||
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;
|
||||
@ -120,6 +121,7 @@ public class ProjectIdeaDaoJPAImp extends AbstractDaoJPAImp<ProjectIdea>
|
||||
.author(params.getAuthor())
|
||||
.supervisor(params.getSupervisor())
|
||||
.reviewer(params.getReviewer())
|
||||
.keywords(params.getKeywords())
|
||||
.sortAndPaginate(params);
|
||||
}
|
||||
|
||||
@ -217,6 +219,15 @@ public class ProjectIdeaDaoJPAImp extends AbstractDaoJPAImp<ProjectIdea>
|
||||
return this;
|
||||
}
|
||||
|
||||
public QuerySet keywords(Collection<Keyword> keywords) {
|
||||
if (keywords != null && !keywords.isEmpty()) {
|
||||
getQuery().combine(
|
||||
new Query().join("_.keywords.keywords k").where("k in (:keywords)").parameter(
|
||||
"keywords", keywords)).distinct();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public QuerySet statuses(Collection<Match.Status> statuses) {
|
||||
List<Match.Status> filterStatuses = new ArrayList<Match.Status>();
|
||||
boolean hasUnmatched = false;
|
||||
|
@ -122,13 +122,15 @@ public class SupervisorDaoJPAImp extends QueryableDaoJPAImp<Employee, Supervisor
|
||||
}
|
||||
|
||||
public QuerySet keywords(Collection<Keyword> keywords) {
|
||||
if (keywords != null) {
|
||||
if (keywords != null && !keywords.isEmpty()) {
|
||||
getQuery().combine(
|
||||
new Query().join("_.keywords.keywords k").where("k in (:keywords)").parameter(
|
||||
"keywords", keywords)).distinct();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public QuerySet keyword(Keyword keyword) {
|
||||
if (keyword != null) {
|
||||
|
@ -1,26 +1,11 @@
|
||||
package se.su.dsv.scipro.match.dataobject;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Cacheable;
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.Embedded;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.OrderBy;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.*;
|
||||
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
@ -44,6 +29,11 @@ public class ProjectIdea extends DomainObject {
|
||||
@SortableField
|
||||
private ProjectClass projectClass;
|
||||
|
||||
|
||||
@Embedded
|
||||
@AssociationOverride(name="supervisorInterest", joinTable=@JoinTable(name="projectIdea_Employee"))
|
||||
private SupervisorInterest supervisorInterest; // the object is set in the application code
|
||||
|
||||
@ManyToMany
|
||||
private List<Student> authors = new ArrayList<Student>();
|
||||
|
||||
@ -88,6 +78,14 @@ public class ProjectIdea extends DomainObject {
|
||||
return id;
|
||||
}
|
||||
|
||||
public SupervisorInterest getSupervisorInterest() {
|
||||
return supervisorInterest;
|
||||
}
|
||||
|
||||
public void setSupervisorInterest(SupervisorInterest supervisorInterest) {
|
||||
this.supervisorInterest = supervisorInterest;
|
||||
}
|
||||
|
||||
public ApplicationPeriod getApplicationPeriod() {
|
||||
return applicationPeriod;
|
||||
}
|
||||
@ -178,7 +176,7 @@ public class ProjectIdea extends DomainObject {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ProjectIdea [id=" + (id != null ? id : "") + ", projectClass=" + (projectClass != null ? projectClass : "")
|
||||
return "ProjectIdea [id=" + (id != null ? id : "") + ", projectClass=" + (projectClass != null ? projectClass : "") + ", supervisorInterest=" + (supervisorInterest != null ? supervisorInterest : "")
|
||||
+ ", authors=" + (authors != null ? authors : "") + ", preferredSupervisor=" + (preferredSupervisor != null ? preferredSupervisor : "")
|
||||
+ ", externalSupervisorInfo=" + (externalSupervisorInfo != null ? externalSupervisorInfo : "") + ", keywords=" + (keywords != null ? keywords : "")
|
||||
+ ", title="+ (title != null ? title : "") + ", watson=" + (watson != null ? watson : "")
|
||||
@ -208,6 +206,9 @@ public class ProjectIdea extends DomainObject {
|
||||
result =
|
||||
prime * result
|
||||
+ ((projectClass == null) ? 0 : projectClass.hashCode());
|
||||
result =
|
||||
prime * result
|
||||
+ ((supervisorInterest == null) ? 0 : supervisorInterest.hashCode());
|
||||
result = prime * result + ((title == null) ? 0 : title.hashCode());
|
||||
result = prime * result + ((watson == null) ? 0 : watson.hashCode());
|
||||
return result;
|
||||
@ -256,6 +257,11 @@ public class ProjectIdea extends DomainObject {
|
||||
return false;
|
||||
} else if (!projectClass.equals(other.projectClass))
|
||||
return false;
|
||||
if (supervisorInterest == null) {
|
||||
if (other.supervisorInterest != null)
|
||||
return false;
|
||||
} else if (!supervisorInterest.equals(other.supervisorInterest))
|
||||
return false;
|
||||
if (title == null) {
|
||||
if (other.title != null)
|
||||
return false;
|
||||
@ -294,110 +300,6 @@ public class ProjectIdea extends DomainObject {
|
||||
return match.getStatus().toString();
|
||||
}
|
||||
|
||||
|
||||
@Embeddable
|
||||
public static class Watson implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 6425139094214449167L;
|
||||
|
||||
// Watson-box-data
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String what = "";
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String why = "";
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String theoryHow = "";
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String practicalHow = "";
|
||||
|
||||
public String getWhat() {
|
||||
return what;
|
||||
}
|
||||
|
||||
public void setWhat(String what) {
|
||||
this.what = what;
|
||||
}
|
||||
|
||||
public String getWhy() {
|
||||
return why;
|
||||
}
|
||||
|
||||
public void setWhy(String why) {
|
||||
this.why = why;
|
||||
}
|
||||
|
||||
public String getTheoryHow() {
|
||||
return theoryHow;
|
||||
}
|
||||
|
||||
public void setTheoryHow(String theoryHow) {
|
||||
this.theoryHow = theoryHow;
|
||||
}
|
||||
|
||||
public String getPracticalHow() {
|
||||
return practicalHow;
|
||||
}
|
||||
|
||||
public void setPracticalHow(String practicalHow) {
|
||||
this.practicalHow = practicalHow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Watson [what=" + what + ", why=" + why + ", theoryHow="
|
||||
+ theoryHow + ", practicalHow=" + practicalHow + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result =
|
||||
prime * result
|
||||
+ ((practicalHow == null) ? 0 : practicalHow.hashCode());
|
||||
result =
|
||||
prime * result
|
||||
+ ((theoryHow == null) ? 0 : theoryHow.hashCode());
|
||||
result = prime * result + ((what == null) ? 0 : what.hashCode());
|
||||
result = prime * result + ((why == null) ? 0 : why.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Watson other = (Watson) obj;
|
||||
if (practicalHow == null) {
|
||||
if (other.practicalHow != null)
|
||||
return false;
|
||||
} else if (!practicalHow.equals(other.practicalHow))
|
||||
return false;
|
||||
if (theoryHow == null) {
|
||||
if (other.theoryHow != null)
|
||||
return false;
|
||||
} else if (!theoryHow.equals(other.theoryHow))
|
||||
return false;
|
||||
if (what == null) {
|
||||
if (other.what != null)
|
||||
return false;
|
||||
} else if (!what.equals(other.what))
|
||||
return false;
|
||||
if (why == null) {
|
||||
if (other.why != null)
|
||||
return false;
|
||||
} else if (!why.equals(other.why))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void addMatch(Match match) {
|
||||
match.setProjectIdea(this);
|
||||
this.match = match;
|
||||
|
@ -0,0 +1,52 @@
|
||||
package se.su.dsv.scipro.match.dataobject;
|
||||
|
||||
import se.su.dsv.scipro.data.dataobjects.Employee;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.ManyToMany;
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
|
||||
@Embeddable
|
||||
public class SupervisorInterest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 6019515679819483607L;
|
||||
|
||||
@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
|
||||
private List<Employee> supervisorInterest = new ArrayList<Employee>();
|
||||
|
||||
public List<Employee> getSupervisorInterest() {
|
||||
return supervisorInterest;
|
||||
}
|
||||
|
||||
public void setSupervisorInterest(List<Employee> supervisorInterest) {
|
||||
this.supervisorInterest = supervisorInterest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SupervisorInterest{" +
|
||||
"supervisorInterest=" + supervisorInterest +
|
||||
'}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
SupervisorInterest that = (SupervisorInterest) o;
|
||||
|
||||
if (supervisorInterest != null ? !supervisorInterest.equals(that.supervisorInterest) : that.supervisorInterest != null)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return supervisorInterest != null ? supervisorInterest.hashCode() : 0;
|
||||
}
|
||||
}
|
106
src/main/java/se/su/dsv/scipro/match/dataobject/Watson.java
Normal file
106
src/main/java/se/su/dsv/scipro/match/dataobject/Watson.java
Normal file
@ -0,0 +1,106 @@
|
||||
package se.su.dsv.scipro.match.dataobject;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Embeddable
|
||||
public class Watson implements Serializable {
|
||||
private static final long serialVersionUID = 8028674038959771277L;
|
||||
// Watson-box-data
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String what = "";
|
||||
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String why = "";
|
||||
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String theoryHow = "";
|
||||
|
||||
@Column(nullable = false, length = 1024)
|
||||
private String practicalHow = "";
|
||||
|
||||
public String getWhat() {
|
||||
return what;
|
||||
}
|
||||
|
||||
public void setWhat(String what) {
|
||||
this.what = what;
|
||||
}
|
||||
|
||||
public String getWhy() {
|
||||
return why;
|
||||
}
|
||||
|
||||
public void setWhy(String why) {
|
||||
this.why = why;
|
||||
}
|
||||
|
||||
public String getTheoryHow() {
|
||||
return theoryHow;
|
||||
}
|
||||
|
||||
public void setTheoryHow(String theoryHow) {
|
||||
this.theoryHow = theoryHow;
|
||||
}
|
||||
|
||||
public String getPracticalHow() {
|
||||
return practicalHow;
|
||||
}
|
||||
|
||||
public void setPracticalHow(String practicalHow) {
|
||||
this.practicalHow = practicalHow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Watson [what=" + what + ", why=" + why + ", theoryHow="
|
||||
+ theoryHow + ", practicalHow=" + practicalHow + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result =
|
||||
prime * result
|
||||
+ ((practicalHow == null) ? 0 : practicalHow.hashCode());
|
||||
result =
|
||||
prime * result
|
||||
+ ((theoryHow == null) ? 0 : theoryHow.hashCode());
|
||||
result = prime * result + ((what == null) ? 0 : what.hashCode());
|
||||
result = prime * result + ((why == null) ? 0 : why.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Watson other = (Watson) obj;
|
||||
if (practicalHow == null) {
|
||||
if (other.practicalHow != null)
|
||||
return false;
|
||||
} else if (!practicalHow.equals(other.practicalHow))
|
||||
return false;
|
||||
if (theoryHow == null) {
|
||||
if (other.theoryHow != null)
|
||||
return false;
|
||||
} else if (!theoryHow.equals(other.theoryHow))
|
||||
return false;
|
||||
if (what == null) {
|
||||
if (other.what != null)
|
||||
return false;
|
||||
} else if (!what.equals(other.what))
|
||||
return false;
|
||||
if (why == null) {
|
||||
if (other.why != null)
|
||||
return false;
|
||||
} else if (!why.equals(other.why))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,71 +1,73 @@
|
||||
package se.su.dsv.scipro.match.dataprovider;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
|
||||
import se.su.dsv.scipro.data.dao.interfaces.Dao;
|
||||
import se.su.dsv.scipro.dataproviders.SortSpecifier;
|
||||
import se.su.dsv.scipro.dataproviders.SortableDataProvider;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
|
||||
import se.su.dsv.scipro.match.dataobject.Match;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
|
||||
/**
|
||||
* Custom (and well behaved) SortableDataProvider implementation with Dao-injection override mechanics and custom sorting-fields.
|
||||
* @see base type for more information.
|
||||
*/
|
||||
public class ProjectIdeaDataProvider extends SortableDataProvider<ProjectIdea>{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@SpringBean
|
||||
protected ProjectIdeaDao projectIdeaDao;
|
||||
private ProjectIdeaDao.Params params;
|
||||
|
||||
/**
|
||||
*/
|
||||
public ProjectIdeaDataProvider() {
|
||||
this(null);
|
||||
}
|
||||
/**
|
||||
* Create provider with the given SortSpecifier.
|
||||
* @param sortSpecifier
|
||||
*/
|
||||
public ProjectIdeaDataProvider(final SortSpecifier sortSpecifier) {
|
||||
super(sortSpecifier, ProjectIdea.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Dao<ProjectIdea> getDao() {
|
||||
return projectIdeaDao;
|
||||
}
|
||||
|
||||
|
||||
public void setParams(ProjectIdeaDao.Params params){
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
public Iterator<ProjectIdea> iterator(int first, int count) {
|
||||
|
||||
params.setLimit(count);
|
||||
params.setOffset(first);
|
||||
|
||||
Iterator<ProjectIdea> itr;
|
||||
itr = ((ProjectIdeaDao) getDao()).findProjectIdeas(params).iterator();
|
||||
|
||||
if(params.getStatuses() != null){
|
||||
if(params.getStatuses().contains(Match.Status.PUBLISHED) && params.getStatuses().size() == 1 && params.getSupervisor() == null){
|
||||
itr = ((ProjectIdeaDao) getDao()).findTopWaitingProjects(params).iterator();
|
||||
}
|
||||
}
|
||||
return itr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
params.setLimit(null);
|
||||
params.setOffset(null);
|
||||
return (int) ((ProjectIdeaDao) getDao()).countProjectIdeas(params);
|
||||
}
|
||||
|
||||
package se.su.dsv.scipro.match.dataprovider;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
|
||||
import se.su.dsv.scipro.data.dao.interfaces.Dao;
|
||||
import se.su.dsv.scipro.dataproviders.SortSpecifier;
|
||||
import se.su.dsv.scipro.dataproviders.SortableDataProvider;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
|
||||
import se.su.dsv.scipro.match.dataobject.Match;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
|
||||
/**
|
||||
* Custom (and well behaved) SortableDataProvider implementation with Dao-injection override mechanics and custom sorting-fields.
|
||||
* @see base type for more information.
|
||||
*/
|
||||
public class ProjectIdeaDataProvider extends SortableDataProvider<ProjectIdea>{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@SpringBean
|
||||
protected ProjectIdeaDao projectIdeaDao;
|
||||
|
||||
private ProjectIdeaDao.Params params;
|
||||
|
||||
/**
|
||||
*/
|
||||
public ProjectIdeaDataProvider() {
|
||||
this(null);
|
||||
}
|
||||
/**
|
||||
* Create provider with the given SortSpecifier.
|
||||
* @param sortSpecifier
|
||||
*/
|
||||
public ProjectIdeaDataProvider(final SortSpecifier sortSpecifier) {
|
||||
super(sortSpecifier, ProjectIdea.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Dao<ProjectIdea> getDao() {
|
||||
return projectIdeaDao;
|
||||
}
|
||||
|
||||
|
||||
public void setParams(ProjectIdeaDao.Params params){
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
public Iterator<ProjectIdea> iterator(int first, int count) {
|
||||
|
||||
params.setLimit(count);
|
||||
params.setOffset(first);
|
||||
|
||||
Iterator<ProjectIdea> itr;
|
||||
itr = ((ProjectIdeaDao) getDao()).findProjectIdeas(params).iterator();
|
||||
|
||||
if(params.getStatuses() != null){
|
||||
if(params.getStatuses().contains(Match.Status.PUBLISHED) && params.getStatuses().size() == 1 && params.getSupervisor() == null){
|
||||
itr = ((ProjectIdeaDao) getDao()).findTopWaitingProjects(params).iterator();
|
||||
}
|
||||
}
|
||||
return itr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
params.setLimit(null);
|
||||
params.setOffset(null);
|
||||
return (int) ((ProjectIdeaDao) getDao()).countProjectIdeas(params);
|
||||
}
|
||||
|
||||
}
|
@ -27,16 +27,15 @@
|
||||
<div class="span-22 append-bottom last">
|
||||
<div class="span-3" wicket:id="projectClassPanel"></div>
|
||||
<div class="span-7 last append-bottom" wicket:id="matchStatusPanel"></div>
|
||||
<div class="span-5">
|
||||
<div class="span-7">
|
||||
<div><input wicket:id="filterButton" type="submit"/></div>
|
||||
<div class="prepend-top"><label>DO NOT TOUCH unless you know what you're doing!</label></div>
|
||||
</div>
|
||||
<div class="span-5">
|
||||
<div><label>DO NOT TOUCH unless you know what you're doing!</label></div>
|
||||
<div>
|
||||
<button wicket:id="acceptLink">Force accept all PUBLISHED ideas</button>
|
||||
<button wicket:id="acceptLink">Force accept all SUGGESTED ideas</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
@ -116,7 +116,6 @@ public class AdminManageProjectIdeaPanel extends Panel {
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
// if (target != null) {
|
||||
dialog.replace(new AdminEditProjectIdeaPanel("dialogContent", new Model<ProjectIdea>(idea), feedBackPanel) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
});
|
||||
@ -124,7 +123,6 @@ public class AdminManageProjectIdeaPanel extends Panel {
|
||||
target.addComponent(dialog);
|
||||
|
||||
dialog.open(target);
|
||||
// }
|
||||
}
|
||||
|
||||
};
|
||||
@ -177,6 +175,7 @@ public class AdminManageProjectIdeaPanel extends Panel {
|
||||
protected void onUpdate(AjaxRequestTarget target) {
|
||||
allDataView.setItemsPerPage(itemsPerPageChoice.getModelObject());
|
||||
target.addComponent(allContainer);
|
||||
target.addComponent(totalProjectIdeas);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
package se.su.dsv.scipro.match.panel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
@ -28,19 +27,15 @@ public class FilterFormProjectClassPanel extends Panel {
|
||||
|
||||
@SpringBean
|
||||
private ProjectClassDao projectClassDao;
|
||||
|
||||
private List<ProjectClass> projectClasses = new ArrayList<ProjectClass>();
|
||||
|
||||
private final CheckGroup<ProjectClass> checkGroup;
|
||||
|
||||
public FilterFormProjectClassPanel(String id, final List<ProjectClass> projectClassesToSet) {
|
||||
|
||||
private final CheckGroup<ProjectClass> checkGroup;
|
||||
|
||||
public FilterFormProjectClassPanel(String id, final List<ProjectClass> projectClassesToSet) {
|
||||
super(id);
|
||||
|
||||
projectClasses = projectClassDao.findAll();
|
||||
CompoundPropertyModel<List<ProjectClass>> projectClassModel = new CompoundPropertyModel<List<ProjectClass>>(projectClasses);
|
||||
|
||||
checkGroup = new CheckGroup<ProjectClass>("checkGroup",projectClassesToSet /*new ArrayList<ProjectClass>()*/);
|
||||
|
||||
List<ProjectClass> projectClasses1 = projectClassDao.findAll();
|
||||
CompoundPropertyModel<List<ProjectClass>> projectClassModel = new CompoundPropertyModel<List<ProjectClass>>(projectClasses1);
|
||||
checkGroup = new CheckGroup<ProjectClass>("checkGroup",projectClassesToSet);
|
||||
|
||||
final WebMarkupContainer container = new WebMarkupContainer("container");
|
||||
container.setOutputMarkupId(true);
|
||||
ListView<ProjectClass> projectClasses = new ListView<ProjectClass>("projectClasses", projectClassModel) {
|
||||
@ -49,11 +44,7 @@ public class FilterFormProjectClassPanel extends Panel {
|
||||
|
||||
@Override
|
||||
protected void populateItem(ListItem<ProjectClass> item) {
|
||||
|
||||
Check<ProjectClass> projectClassCheckBox = new Check<ProjectClass>("projectClassCheckBox", item.getModel());
|
||||
/*if(projectClassesToSet.contains(item.getModelObject())){
|
||||
projectClassCheckBox.
|
||||
}*/
|
||||
item.add(projectClassCheckBox);
|
||||
Label projectClassName = new Label("projectClassName", item.getModel().getObject().getName());
|
||||
item.add(projectClassName);
|
||||
@ -67,5 +58,5 @@ public class FilterFormProjectClassPanel extends Panel {
|
||||
|
||||
public List<ProjectClass> getSelectedprojectClasses(){
|
||||
return (List<ProjectClass>) checkGroup.getModelObject();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,8 @@
|
||||
</h5>
|
||||
<div><b>Project status: </b></div>
|
||||
<div wicket:id="status"></div>
|
||||
<div><b>Daisy start date </b></div>
|
||||
<div wicket:id="daisyStartDateLabel"></div>
|
||||
<div><b>Title: </b></div>
|
||||
<div wicket:id="title"></div>
|
||||
<div><b>Authors: </b></div>
|
||||
|
@ -1,8 +1,5 @@
|
||||
package se.su.dsv.scipro.project.panels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.markup.html.basic.Label;
|
||||
import org.apache.wicket.markup.html.link.ExternalLink;
|
||||
import org.apache.wicket.markup.html.list.ListItem;
|
||||
@ -10,15 +7,16 @@ import org.apache.wicket.markup.html.list.ListView;
|
||||
import org.apache.wicket.markup.html.panel.EmptyPanel;
|
||||
import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.model.IModel;
|
||||
import org.apache.wicket.model.Model;
|
||||
import org.apache.wicket.model.PropertyModel;
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
|
||||
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
|
||||
import se.su.dsv.scipro.data.dataobjects.Project;
|
||||
import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
|
||||
import se.su.dsv.scipro.data.dataobjects.Student;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ProjectDetailsPanel extends Panel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -40,7 +38,13 @@ public class ProjectDetailsPanel extends Panel {
|
||||
else if(project.getProjectStatus()!=null){
|
||||
add(new Label("status", "This project is " + project.getProjectStatus().toString()));
|
||||
}
|
||||
|
||||
|
||||
if (project.getDaisyStartDate()==null){
|
||||
add(new Label("daisyStartDateLabel", "Cannot get Daisy start date"));
|
||||
}
|
||||
else {
|
||||
add(new Label("daisyStartDateLabel", project.getDaisyStartDate().toString()));
|
||||
}
|
||||
|
||||
add(new Label("title", new PropertyModel<Project>(project, "title")));
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
</div>
|
||||
|
||||
<div class="span-22 last" wicket:id="dataviewContainer">
|
||||
<div>Number of projects: <span wicket:id="totalProjectsLabel"></span></div>
|
||||
<table class="rounded-corner">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -44,6 +44,7 @@ public class ProjectManagementPanel extends Panel {
|
||||
private ProjectDao.Params params;
|
||||
private NewProjectDataProvider dataProvider;
|
||||
|
||||
private Label totalProjectsLabel;
|
||||
private Label emptyLabel;
|
||||
private PagingNavigator nav;
|
||||
|
||||
@ -64,6 +65,8 @@ public class ProjectManagementPanel extends Panel {
|
||||
target.addComponent(nav);
|
||||
emptyLabel.setVisible(dataProvider.size() == 0);
|
||||
target.addComponent(emptyLabel);
|
||||
totalProjectsLabel.setDefaultModel(new Model(new String(Integer.toString(dataProvider.size()))));
|
||||
target.addComponent(totalProjectsLabel);
|
||||
}
|
||||
|
||||
private void dataviewSetup() {
|
||||
@ -146,11 +149,11 @@ public class ProjectManagementPanel extends Panel {
|
||||
|
||||
@Override
|
||||
public void onUpdate(AjaxRequestTarget target) {
|
||||
// dialog.close(target);
|
||||
// ajaxRefresh(target);
|
||||
dialog.close(target);
|
||||
ajaxRefresh(target);
|
||||
// target.addComponent(dialog);
|
||||
|
||||
setResponsePage(ProjectManagementPage.class);
|
||||
// cd g
|
||||
|
||||
}
|
||||
|
||||
@ -191,7 +194,11 @@ public class ProjectManagementPanel extends Panel {
|
||||
nav.setOutputMarkupId(true); //make it ajax-targetable
|
||||
nav.setVisible(dataProvider.size() != 0);
|
||||
dataviewContainer.add(nav); //add it
|
||||
|
||||
|
||||
totalProjectsLabel = new Label("totalProjectsLabel", Integer.toString(dataProvider.size()));
|
||||
totalProjectsLabel.setOutputMarkupId(true);
|
||||
dataviewContainer.add(totalProjectsLabel);
|
||||
|
||||
emptyLabel = new Label("emptyLabel", "No projects to show"); //informs the user that the list is emty
|
||||
emptyLabel.setOutputMarkupId(true); //make it ajax-targetable
|
||||
emptyLabel.setVisible(dataProvider.size() == 0);
|
||||
@ -218,6 +225,7 @@ public class ProjectManagementPanel extends Panel {
|
||||
|
||||
@Override
|
||||
public void onUpdateFilter(AjaxRequestTarget target) {
|
||||
//based on dateCreated, not Daisy-startdate.
|
||||
params.setCreatedAfter(getFromDate());
|
||||
params.setCreatedBefore(getToDate());
|
||||
ajaxRefresh(target);
|
||||
@ -324,11 +332,11 @@ public class ProjectManagementPanel extends Panel {
|
||||
@Override
|
||||
public void onUpdate(AjaxRequestTarget target) {
|
||||
|
||||
// dialog.close(target);
|
||||
// ajaxRefresh(target);
|
||||
dialog.close(target);
|
||||
ajaxRefresh(target);
|
||||
// target.addComponent(dialog);
|
||||
|
||||
setResponsePage(ProjectManagementPage.class);
|
||||
// setResponsePage(ProjectManagementPage.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,23 +1,25 @@
|
||||
package se.su.dsv.scipro.supervisor.pages;
|
||||
|
||||
import org.apache.wicket.PageParameters;
|
||||
|
||||
import se.su.dsv.scipro.basepages.MenuPage;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
import se.su.dsv.scipro.supervisor.panels.SupervisorTabMenuPanel;
|
||||
|
||||
/**
|
||||
* Grants correct authorization and marks the correct main-menu option as "supervisor"
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
*
|
||||
*/
|
||||
@Authorization(authorizedRoles={/* Probably Roles.EXTERNAL, too when/if implemented*/ Roles.EMPLOYEE})
|
||||
public abstract class AbstractSupervisorPage extends MenuPage {
|
||||
|
||||
public AbstractSupervisorPage(PageParameters pp) {
|
||||
super(pp);
|
||||
add(new SupervisorTabMenuPanel("tabMenu", this.getClass()));
|
||||
}
|
||||
|
||||
}
|
||||
package se.su.dsv.scipro.supervisor.pages;
|
||||
|
||||
import org.apache.wicket.PageParameters;
|
||||
|
||||
import se.su.dsv.scipro.basepages.MenuPage;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
import se.su.dsv.scipro.supervisor.panels.SupervisorTabMenuPanel;
|
||||
|
||||
/**
|
||||
* Grants correct authorization and marks the correct main-menu option as "supervisor"
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
*
|
||||
*/
|
||||
@Authorization(authorizedRoles={/* Probably Roles.EXTERNAL, too when/if implemented*/ Roles.EMPLOYEE})
|
||||
public abstract class AbstractSupervisorPage extends MenuPage {
|
||||
|
||||
private static final long serialVersionUID = -1020369453880467888L;
|
||||
|
||||
public AbstractSupervisorPage(PageParameters pp) {
|
||||
super(pp);
|
||||
add(new SupervisorTabMenuPanel("tabMenu", this.getClass()));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import se.su.dsv.scipro.supervisor.panels.SupervisorMatchedThesisPanel;
|
||||
public class SupervisorProjectIdeaPage extends AbstractSupervisorPage {
|
||||
|
||||
public static final String MAIN_MENU_LABEL = "Supervisor";
|
||||
private static final long serialVersionUID = -6146389373527384427L;
|
||||
|
||||
public SupervisorProjectIdeaPage(PageParameters pp) {
|
||||
super(pp);
|
||||
|
@ -3,13 +3,10 @@ package se.su.dsv.scipro.supervisor.pages;
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.PageParameters;
|
||||
import org.apache.wicket.markup.html.panel.FeedbackPanel;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.supervisor.panels.SupervisorMatchedThesisPanel;
|
||||
import se.su.dsv.scipro.supervisor.panels.SupervisorUnmatchedThesisPanel;
|
||||
|
||||
public class SupervisorUnmatchedProjectIdeaPage extends AbstractSupervisorPage {
|
||||
|
||||
public static final String MAIN_MENU_LABEL = "Supervisor";
|
||||
private static final long serialVersionUID = 141782543835745748L;
|
||||
|
||||
public SupervisorUnmatchedProjectIdeaPage(PageParameters pp) {
|
||||
|
@ -0,0 +1,16 @@
|
||||
<!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>
|
||||
<form wicket:id="form">
|
||||
<div wicket:id="wmc1">
|
||||
<div class="append-bottom"><button wicket:id="acceptButton">Report interest to supervise</button></div>
|
||||
</div>
|
||||
</form>
|
||||
</wicket:panel>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,93 @@
|
||||
package se.su.dsv.scipro.supervisor.panels;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.ajax.AjaxRequestTarget;
|
||||
import org.apache.wicket.ajax.markup.html.AjaxLink;
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.form.Form;
|
||||
import org.apache.wicket.markup.html.form.TextArea;
|
||||
import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.model.IModel;
|
||||
import org.apache.wicket.model.LoadableDetachableModel;
|
||||
import org.apache.wicket.model.PropertyModel;
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
import org.apache.wicket.validation.validator.StringValidator;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
import se.su.dsv.scipro.match.dataobject.SupervisorInterest;
|
||||
import se.su.dsv.scipro.data.dataobjects.Employee;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class SupervisorInterestPanel extends Panel {
|
||||
|
||||
private final Logger logger = Logger.getLogger(SupervisorInterestPanel.class);
|
||||
private static final long serialVersionUID = 7164999234242995192L;
|
||||
|
||||
@SpringBean
|
||||
private ProjectIdeaDao projectIdeaDao;
|
||||
|
||||
@SpringBean
|
||||
private GeneralSystemSettingsDao gDao;
|
||||
|
||||
@SpringBean
|
||||
SupervisorDao supervisorDao;
|
||||
|
||||
public abstract void onUpdate(AjaxRequestTarget target);
|
||||
|
||||
public SupervisorInterestPanel(String id, final IModel<ProjectIdea> projectIdeaIModel, final Component feedbackPanel) {
|
||||
super(id);
|
||||
final LoadableDetachableModel<ProjectIdea> projectIdeaModel = new LoadableDetachableModel<ProjectIdea>() {
|
||||
private static final long serialVersionUID = 5696857658828934865L;
|
||||
@Override
|
||||
protected ProjectIdea load() {
|
||||
return projectIdeaDao.load(projectIdeaIModel.getObject().getId());
|
||||
}
|
||||
};
|
||||
add(new SupervisorAcceptDeclineForm(projectIdeaModel, feedbackPanel));
|
||||
}
|
||||
|
||||
private class SupervisorAcceptDeclineForm extends Form<Void> {
|
||||
private static final long serialVersionUID = -3157033328235572033L;
|
||||
|
||||
public SupervisorAcceptDeclineForm(final LoadableDetachableModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel) {
|
||||
super("form");
|
||||
WebMarkupContainer wmc1 = new WebMarkupContainer("wmc1");
|
||||
add(wmc1);
|
||||
wmc1.add(new AjaxLink("acceptButton") {
|
||||
|
||||
private static final long serialVersionUID = -2591216055201410154L;
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
Employee employee = supervisorDao.getFrom(SciProSession.get().getUser());
|
||||
if(isInterestAlreadyAdded(projectIdeaModel.getObject(), employee)) {
|
||||
SupervisorInterest supervisorInterest = new SupervisorInterest();
|
||||
List<Employee> employeeList = new ArrayList<Employee>();
|
||||
employeeList.add(employee);
|
||||
supervisorInterest.setSupervisorInterest(employeeList);
|
||||
projectIdeaModel.getObject().setSupervisorInterest(supervisorInterest);
|
||||
projectIdeaDao.save(projectIdeaModel.getObject());
|
||||
onUpdate(target);
|
||||
String infoText = "Added supervisor interest to " + employee.getNameAsString() + " for the project idea " + projectIdeaModel.getObject().getTitle();
|
||||
SciProSession.get().info(infoText);
|
||||
target.addComponent(feedbackPanel);
|
||||
logger.info(infoText);
|
||||
} else {
|
||||
// the link is disabled when interest already is added for the supervisor so there is no need for a feedback message
|
||||
logger.info("Interest already added for the supervisor " + employee.getNameAsString() + " to supervise the project idea " + projectIdeaModel.getObject().getTitle());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean isInterestAlreadyAdded(ProjectIdea projectIdea, Employee employee ) {
|
||||
List<Employee> existingEmployees = projectIdea.getSupervisorInterest().getSupervisorInterest();
|
||||
return existingEmployees.isEmpty() || !existingEmployees.contains(employee);
|
||||
}
|
||||
}
|
||||
}
|
9
src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorInterestProjectIdeaDialogPanel.html
Normal file
9
src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorInterestProjectIdeaDialogPanel.html
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
|
||||
<body>
|
||||
<wicket:panel>
|
||||
<div wicket:id="watsonPanel"></div>
|
||||
<div wicket:id="acceptDeclinePanel"></div>
|
||||
</wicket:panel>
|
||||
</body>
|
||||
</html>
|
32
src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorInterestProjectIdeaDialogPanel.java
Normal file
32
src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorInterestProjectIdeaDialogPanel.java
Normal file
@ -0,0 +1,32 @@
|
||||
package se.su.dsv.scipro.supervisor.panels;
|
||||
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.ajax.AjaxRequestTarget;
|
||||
import org.apache.wicket.markup.html.panel.Panel;
|
||||
import org.apache.wicket.model.IModel;
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.MatchDao;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
|
||||
public abstract class SupervisorInterestProjectIdeaDialogPanel extends Panel {
|
||||
private static final long serialVersionUID = 6580700521723559167L;
|
||||
|
||||
@SpringBean
|
||||
MatchDao matchDao;
|
||||
|
||||
public abstract void onUpdateUpdate(AjaxRequestTarget target);
|
||||
|
||||
public SupervisorInterestProjectIdeaDialogPanel(String id, final IModel<ProjectIdea> projectIdea, final Component feedbackPanel) {
|
||||
super(id);
|
||||
add(new WatsonInfoPanel("watsonPanel", projectIdea.getObject()));
|
||||
|
||||
add(new SupervisorInterestPanel("acceptDeclinePanel", projectIdea, feedbackPanel){
|
||||
private static final long serialVersionUID = 2192277777696201317L;
|
||||
|
||||
@Override
|
||||
public void onUpdate(AjaxRequestTarget target) {
|
||||
onUpdateUpdate(target);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,45 +1,48 @@
|
||||
package se.su.dsv.scipro.supervisor.panels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.wicket.Page;
|
||||
|
||||
import se.su.dsv.scipro.components.AbstractMenuPanel;
|
||||
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyProjects;
|
||||
import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
|
||||
import se.su.dsv.scipro.supervisor.pages.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
*
|
||||
*/
|
||||
public class SupervisorTabMenuPanel extends AbstractMenuPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SupervisorTabMenuPanel(String id, Class<? extends Page> containerClass) {
|
||||
super(id, AbstractSupervisorPage.class, containerClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<MenuItem> getItemList() {
|
||||
|
||||
List<MenuItem> items = new ArrayList<MenuItem>();
|
||||
items.add(new MenuItem("My Projects", SupervisorStartPage.class, MenuHighlightSupervisorMyProjects.class));
|
||||
items.add(new MenuItem("My Project Ideas", SupervisorProjectIdeaPage.class));
|
||||
items.add(new MenuItem("Unmatched project ideas", SupervisorUnmatchedProjectIdeaPage.class));
|
||||
items.add(new MenuItem("Activity plan templates", SupervisorScheduleTemplatesPage.class));
|
||||
items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class));
|
||||
items.add(new MenuItem("Final Seminars", SupervisorProjectsFinalSeminarPage.class));
|
||||
items.add(new MenuItem("Profile",SupervisorProfilePage.class));
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MenuType getMenuType() {
|
||||
return MenuType.TAB_MULTIPLE_ROWS;
|
||||
}
|
||||
|
||||
}
|
||||
package se.su.dsv.scipro.supervisor.panels;
|
||||
|
||||
import org.apache.wicket.Page;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.components.AbstractMenuPanel;
|
||||
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyProjects;
|
||||
import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
import se.su.dsv.scipro.supervisor.pages.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Martin Peters - mpeters@dsv.su.se
|
||||
*
|
||||
*/
|
||||
public class SupervisorTabMenuPanel extends AbstractMenuPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SupervisorTabMenuPanel(String id, Class<? extends Page> containerClass) {
|
||||
super(id, AbstractSupervisorPage.class, containerClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<MenuItem> getItemList() {
|
||||
|
||||
List<MenuItem> items = new ArrayList<MenuItem>();
|
||||
items.add(new MenuItem("My projects", SupervisorStartPage.class, MenuHighlightSupervisorMyProjects.class));
|
||||
items.add(new MenuItem("My project Ideas", SupervisorProjectIdeaPage.class));
|
||||
if(SciProSession.get().authorizedForRole(Roles.SYSADMIN) && SciProSession.get().hasActualRole(Roles.SYSADMIN)) {
|
||||
items.add(new MenuItem("Unmatched project ideas", SupervisorUnmatchedProjectIdeaPage.class));
|
||||
}
|
||||
items.add(new MenuItem("Activity plan templates", SupervisorScheduleTemplatesPage.class));
|
||||
items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class));
|
||||
items.add(new MenuItem("Final seminars", SupervisorProjectsFinalSeminarPage.class));
|
||||
items.add(new MenuItem("Profile",SupervisorProfilePage.class));
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MenuType getMenuType() {
|
||||
return MenuType.TAB_MULTIPLE_ROWS;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,9 @@
|
||||
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
|
||||
<body>
|
||||
<wicket:panel>
|
||||
<div wicket:id="dialog">
|
||||
<div wicket:id="dialogContent"></div>
|
||||
</div>
|
||||
<div class="prepend-top"></div>
|
||||
|
||||
|
||||
@ -18,34 +21,43 @@
|
||||
<label for="titleField">Title:</label><br/>
|
||||
<input style="width:300px;" wicket:id="titleField" type="text"/><br/>
|
||||
|
||||
<label for="regKeyWordAC">Regular keyword:</label><br/>
|
||||
<label for="regKeyWordAC">Regular keyword (Word):</label><br/>
|
||||
<input style="width:300px;" wicket:id="regKeyWordAC" /><br/>
|
||||
|
||||
<label for="unitKeyWordAC">Unit keyword:</label><br/>
|
||||
<label for="unitKeyWordAC">Unit keyword (Unit):</label><br/>
|
||||
<input style="width:300px;" wicket:id="unitKeyWordAC" /><br/>
|
||||
|
||||
<label for="areaKeyWordAC">Research area keyword:</label><br/>
|
||||
<label for="areaKeyWordAC">Research area keyword (Area):</label><br/>
|
||||
<input style="width:300px;" wicket:id="areaKeyWordAC" /><br/>
|
||||
</div>
|
||||
<div class="span-14 last" >
|
||||
<strong>Selected keywords and keyword types:</strong>
|
||||
<label>Selected keywords:</label>
|
||||
<ul wicket:id="keyWordsContainer">
|
||||
<li wicket:id="keywordList">
|
||||
<h5><span wicket:id="keyWord">[keyword]</span> (<span wicket:id="keyWordType">[keyWordType]</span>)</h5>
|
||||
<h5>
|
||||
<span wicket:id="keyWord">[keyword]</span> (<span wicket:id="keyWordType">[keyWordType]</span>)<span wicket:id ="isDeleted" style="color: red;">[is deleted]</span>
|
||||
<img wicket:id="deleteKeyWordIcon" />
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="span-22 last append-bottom">
|
||||
<div class="span-22 last">
|
||||
<div class="span-3" wicket:id="projectClassPanel">
|
||||
|
||||
</div>
|
||||
<div class="span-5">
|
||||
<div class="span-12">
|
||||
<label>Include inactive keywords:</label><br />
|
||||
<input type="checkbox" wicket:id="includeDeleted" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="span-22 last append-bottom">
|
||||
<div class="span-2">
|
||||
<div><input wicket:id="filterButton" type="submit"/></div>
|
||||
</div>
|
||||
<div class="span-5">
|
||||
<div><button wicket:id="clearSearchTermsButton">Clear search terms</button></div>
|
||||
<div class="span-2">
|
||||
<div><button wicket:id="clearSearchTermsButton">Clear</button></div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -59,14 +71,12 @@
|
||||
<div class="span-22 last">
|
||||
<table class="rounded-corner">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="rounded-left-top"><a href="#" wicket:id="levelSortLink">Level</a></th>
|
||||
<th><a href="#" wicket:id="titleSortLink">Title</a></th>
|
||||
<th>Author(s)</th>
|
||||
<th><a href="#" wicket:id="supervisorSortLink">Matched to</a></th>
|
||||
<th>Unit</th>
|
||||
<th><a href="#" wicket:id="statusSortLink">Status</a></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="rounded-left-top"><a href="#" wicket:id="levelSortLink">Level</a></th>
|
||||
<th><a href="#" wicket:id="titleSortLink">Title</a></th>
|
||||
<th>Author(s)</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
@ -76,11 +86,9 @@
|
||||
<tbody>
|
||||
<tr wicket:id="allDataView">
|
||||
<td wicket:id="level"></td>
|
||||
<td wicket:id="title"></td>
|
||||
<td><a wicket:id="openLink"><span wicket:id="title"></span></a></td>
|
||||
<td wicket:id="author"></td>
|
||||
<td wicket:id="supervisor"></td>
|
||||
<td wicket:id="supervisorUnit"></td>
|
||||
<td wicket:id="status"></td>
|
||||
<td><span wicket:id="interestAdded" style="color: red;">[interest already added]</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" wicket:id="emptyLabel"></td>
|
||||
|
@ -1,11 +1,13 @@
|
||||
package se.su.dsv.scipro.supervisor.panels;
|
||||
|
||||
import org.apache.commons.lang.builder.CompareToBuilder;
|
||||
import org.apache.wicket.Component;
|
||||
import org.apache.wicket.Session;
|
||||
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.ajax.markup.html.form.AjaxButton;
|
||||
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.basic.Label;
|
||||
import org.apache.wicket.markup.html.form.Form;
|
||||
@ -19,25 +21,34 @@ import org.apache.wicket.markup.repeater.Item;
|
||||
import org.apache.wicket.markup.repeater.data.DataView;
|
||||
import org.apache.wicket.model.Model;
|
||||
import org.apache.wicket.spring.injection.annot.SpringBean;
|
||||
import org.apache.wicket.util.string.Strings;
|
||||
import org.odlabs.wiquery.ui.dialog.Dialog;
|
||||
import se.su.dsv.scipro.SciProSession;
|
||||
import se.su.dsv.scipro.components.CustomDateTimeField;
|
||||
import se.su.dsv.scipro.components.ItemsPerPageChoice;
|
||||
import se.su.dsv.scipro.data.dao.interfaces.Dao.SortableParams.Sort;
|
||||
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.data.dataobjects.Student;
|
||||
import se.su.dsv.scipro.data.facade.ProjectIdeaFacade;
|
||||
import se.su.dsv.scipro.icons.AjaxActionIcon;
|
||||
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.dao.interfaces.ProjectIdeaDao.Params;
|
||||
import se.su.dsv.scipro.match.dataobject.Keyword;
|
||||
import se.su.dsv.scipro.match.dataobject.KeywordType;
|
||||
import se.su.dsv.scipro.match.dataobject.Match;
|
||||
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
|
||||
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
|
||||
import se.su.dsv.scipro.match.dataobject.*;
|
||||
import se.su.dsv.scipro.match.dataprovider.ProjectIdeaDataProvider;
|
||||
import se.su.dsv.scipro.match.panel.FilterFormProjectClassPanel;
|
||||
import se.su.dsv.scipro.security.auth.Authorization;
|
||||
import se.su.dsv.scipro.security.auth.roles.Roles;
|
||||
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
|
||||
import se.su.dsv.wicket.components.AutoCompleteObjectField;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Authorization(authorizedRoles = {Roles.SYSADMIN})
|
||||
public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
|
||||
private static final long serialVersionUID = 3080575522365470502L;
|
||||
@ -50,6 +61,12 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
|
||||
@SpringBean
|
||||
private KeywordTypeDao keywordTypeDao;
|
||||
|
||||
@SpringBean
|
||||
private ProjectClassDao projectClassDao;
|
||||
|
||||
@SpringBean
|
||||
SupervisorDao supervisorDao;
|
||||
|
||||
public SupervisorUnmatchedThesisPanel(String id, final Component feedBackPanel) {
|
||||
super(id);
|
||||
@ -60,7 +77,7 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
Label emptyLabel = new Label("emptyLabel", "No project ideas to show.");
|
||||
|
||||
setOutputMarkupId(totalProjectIdeas, emptyLabel, allContainer);
|
||||
allDataViewSetup(totalProjectIdeas, allContainer, allProvider, emptyLabel);
|
||||
allDataViewSetup(totalProjectIdeas, allContainer, allProvider, emptyLabel, feedBackPanel);
|
||||
FilterForm form = new FilterForm(totalProjectIdeas, allContainer, allProvider, emptyLabel, params, feedBackPanel);
|
||||
addSortingLinks(allContainer, params);
|
||||
add(form);
|
||||
@ -108,10 +125,23 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
allContainer.add(new PagingNavigator("nav", allDataView));
|
||||
allContainer.add(totalProjectIdeas);
|
||||
}
|
||||
|
||||
|
||||
private void allDataViewSetup(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
|
||||
final Label emptyLabel) {
|
||||
|
||||
private Dialog createDialog() {
|
||||
Dialog dialog = new Dialog("dialog");
|
||||
dialog.setModal(true);
|
||||
dialog.setAutoOpen(false);
|
||||
dialog.setWidth(800);
|
||||
dialog.setHeight(800);
|
||||
dialog.add(new EmptyPanel("dialogContent"));
|
||||
return dialog;
|
||||
}
|
||||
|
||||
|
||||
private void allDataViewSetup(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider, final Label emptyLabel,
|
||||
final Component feedBackPanel) {
|
||||
final Dialog dialog = createDialog();
|
||||
add(dialog.setOutputMarkupId(true));
|
||||
allContainer.add(emptyLabel.setOutputMarkupId(true));
|
||||
|
||||
final DataView<ProjectIdea> allDataView = new DataView<ProjectIdea>("allDataView", allProvider) {
|
||||
private static final long serialVersionUID = 1533192070850862197L;
|
||||
@ -120,22 +150,39 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
protected void populateItem(final Item<ProjectIdea> item) {
|
||||
final ProjectIdea idea = item.getModelObject();
|
||||
item.add(new Label("level", new Model<ProjectClass>(idea.getProjectClass())));
|
||||
item.add(new Label("title", new Model<String>(idea.getTitle())));
|
||||
item.add(new Label("author", new Model<String>(createAuthorString(idea))));
|
||||
item.add(new EmptyPanel("supervisor"));
|
||||
item.add(new EmptyPanel("supervisorUnit"));
|
||||
item.add(new Label("status", new Model<String>(idea.getStatus() != null ? idea.getStatus() : "")));
|
||||
if (idea.getMatch().getSupervisor() != null) {
|
||||
item.replace(new Label("supervisor", new Model<String>(idea.getMatch().getSupervisor().getNameAsString())));
|
||||
if (idea.getMatch().getSupervisor().getKeywords().getFiltered("Unit") != null) {
|
||||
List<Keyword> keywordList = idea.getMatch().getSupervisor().getKeywords().getFiltered("Unit");
|
||||
if (!keywordList.isEmpty()) {
|
||||
Keyword kw = keywordList.get(0);
|
||||
item.replace(new Label("supervisorUnit", new Model<String>(kw.getKeyword())));
|
||||
}
|
||||
|
||||
item.add(new AjaxLink<Void>("openLink") {
|
||||
private static final long serialVersionUID = -6853137019834200749L;
|
||||
|
||||
@Override
|
||||
public void onClick(AjaxRequestTarget target) {
|
||||
|
||||
dialog.replace(new SupervisorInterestProjectIdeaDialogPanel("dialogContent", new Model<ProjectIdea>(idea), feedBackPanel) {
|
||||
private static final long serialVersionUID = 5108807012237992330L;
|
||||
|
||||
@Override
|
||||
public void onUpdateUpdate(AjaxRequestTarget target2) {
|
||||
emptyLabel.setVisible(allProvider.size() == 0);
|
||||
dialog.close(target2);
|
||||
target2.addComponent(allContainer);
|
||||
target2.addComponent(emptyLabel);
|
||||
}
|
||||
});
|
||||
|
||||
dialog.setTitle(Strings.escapeMarkup(idea.getTitle()).toString());
|
||||
dialog.open(target);
|
||||
target.addComponent(dialog);
|
||||
}
|
||||
}
|
||||
}.add(new Label("title", new Model<String>(idea.getTitle()))).setEnabled(!isInterestAlreadyAdded(idea)));
|
||||
item.add(new Label("author", new Model<String>(createAuthorString(idea))));
|
||||
item.add(new Label("interestAdded", "Interest is added") {
|
||||
private static final long serialVersionUID = 7583144096184196178L;
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return isInterestAlreadyAdded(idea);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -155,12 +202,15 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
});
|
||||
allContainer.add(itemsPerPageChoice);
|
||||
}
|
||||
|
||||
private boolean isInterestAlreadyAdded(ProjectIdea projectIdea) {
|
||||
List<Employee> existingEmployees = projectIdea.getSupervisorInterest().getSupervisorInterest();
|
||||
return !existingEmployees.isEmpty() && existingEmployees.contains(supervisorDao.getFrom(SciProSession.get().getUser()));
|
||||
}
|
||||
|
||||
private void addSortingLinks(final WebMarkupContainer allContainer, final Params params) {
|
||||
addSortLink("level", "projectClass.name", allContainer, params);
|
||||
addSortLink("title", "title", allContainer, params);
|
||||
addSortLink("status", "match.status", allContainer, params);
|
||||
addSortLink("supervisor", "match.supervisor", allContainer, params);
|
||||
}
|
||||
|
||||
private void addSortLink(String markup, final String sortField, final WebMarkupContainer allContainer, final Params params) {
|
||||
@ -180,8 +230,8 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
allContainer.add(sortLink);
|
||||
}
|
||||
|
||||
public AutoCompleteObjectField<Keyword, Long> createKeywordAC(final String wicketId, final KeywordTypeDao.TYPE keyWordType,
|
||||
final List<Keyword> keywords, final Component feedBackPanel, final WebMarkupContainer keyWordsContainer) {
|
||||
private AutoCompleteObjectField<Keyword, Long> createKeywordAC(final String wicketId, final KeywordTypeDao.TYPE keyWordType, final List<Keyword> keywords, final Component feedBackPanel,
|
||||
final WebMarkupContainer keyWordsContainer, final AjaxCheckBox includeDeletedChbx) {
|
||||
return new AutoCompleteObjectField<Keyword, Long>(wicketId, Keyword.class) {
|
||||
private static final long serialVersionUID = 7734889540424308421L;
|
||||
|
||||
@ -214,9 +264,9 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
|
||||
@Override
|
||||
public Iterator<Keyword> getChoices(String input) {
|
||||
final KeywordType kwtype = keywordTypeDao.findByType(keyWordType); // keyWordType is only the Type, but the object is required in findAllFromType
|
||||
|
||||
return keywordDao.getAutoCompleteCapableSupervisors(kwtype, input).iterator();
|
||||
boolean includeDeleted = includeDeletedChbx.getModelObject() != null ? includeDeletedChbx.getModelObject() : false;
|
||||
final KeywordType kwtype = keywordTypeDao.findByType(keyWordType);
|
||||
return keywordDao.getAutoCompleteCapableSupervisors(kwtype, input, includeDeleted).iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -227,8 +277,20 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
if(!keywords.contains(newSelection)) {
|
||||
keywords.add(newSelection);
|
||||
}
|
||||
Collections.sort(keywords, new Comparator<Keyword>() {
|
||||
@Override
|
||||
public int compare(Keyword o1, Keyword o2) {
|
||||
return new CompareToBuilder().append(o1.getKeyword().toLowerCase(), o2.getKeyword().toLowerCase()).toComparison();
|
||||
}
|
||||
});
|
||||
//noinspection unchecked
|
||||
((ListView) keyWordsContainer.get("keywordList")).setModelObject(keywords);
|
||||
Session.get().info("Added the keyword " + newSelection + " to the search terms.");
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("Added the keyword ").append(newSelection).append(" (").append(newSelection.getType().getName()).append(") to the search terms.");
|
||||
if(newSelection.isDeleted()) {
|
||||
stringBuilder.append(" The keyword is inactive");
|
||||
}
|
||||
Session.get().info(stringBuilder.toString());
|
||||
this.setModelObject(null);
|
||||
this.clearInput();
|
||||
pTarget.addComponent(this);
|
||||
@ -243,61 +305,121 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
private class FilterForm extends Form<Void> {
|
||||
private static final long serialVersionUID = -3290826142955107010L;
|
||||
|
||||
public FilterForm(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
|
||||
final Label emptyLabel, final Params params, final Component feedBackPanel) {
|
||||
public FilterForm(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider, final Label emptyLabel, final Params params, final Component feedBackPanel) {
|
||||
super("form");
|
||||
final TextField<String> titleField = new TextField<String>("titleField", new Model<String>());
|
||||
titleField.setOutputMarkupId(true);
|
||||
final List<Keyword> keywords = new ArrayList<Keyword>();
|
||||
|
||||
ListView<Keyword> keywordListView = new ListView<Keyword>("keywordList", new Model<ArrayList<Keyword>>()) {
|
||||
private static final long serialVersionUID = 78442920410294688L;
|
||||
final WebMarkupContainer keyWordsContainer = new WebMarkupContainer("keyWordsContainer");
|
||||
final ListView<Keyword> keywordListView = createKeywordListView(keyWordsContainer, feedBackPanel);
|
||||
keyWordsContainer.add(keywordListView.setOutputMarkupId(true));
|
||||
add(keyWordsContainer.setOutputMarkupId(true));
|
||||
|
||||
final AjaxCheckBox includeDeletedChbx = new AjaxCheckBox("includeDeleted", new Model<Boolean>()) {
|
||||
private static final long serialVersionUID = -1810576794268334574L;
|
||||
@Override
|
||||
protected void populateItem(ListItem<Keyword> keywordListItem) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
Keyword keyword = keywordListItem.getModelObject();
|
||||
keywordListItem.add(new Label("keyWord",keyword.getKeyword()));
|
||||
keywordListItem.add(new Label("keyWordType",keyword.getType().getName()));
|
||||
protected void onUpdate(AjaxRequestTarget target) {
|
||||
target.addComponent(this);
|
||||
}
|
||||
};
|
||||
|
||||
final WebMarkupContainer keyWordsContainer = new WebMarkupContainer("keyWordsContainer");
|
||||
keyWordsContainer.setOutputMarkupId(true);
|
||||
keyWordsContainer.add(keywordListView);
|
||||
add(keyWordsContainer);
|
||||
|
||||
AutoCompleteObjectField<Keyword, Long> regKeyWordAc = createKeywordAC("regKeyWordAC", KeywordTypeDao.TYPE.REGULAR, keywords, feedBackPanel, keyWordsContainer);
|
||||
AutoCompleteObjectField<Keyword, Long> unitKeyWordAc = createKeywordAC("unitKeyWordAC", KeywordTypeDao.TYPE.UNIT, keywords, feedBackPanel, keyWordsContainer);
|
||||
AutoCompleteObjectField<Keyword, Long> areaKeyWordAc = createKeywordAC("areaKeyWordAC", KeywordTypeDao.TYPE.RESEARCH_AREA, keywords, feedBackPanel, keyWordsContainer);
|
||||
regKeyWordAc.setOutputMarkupId(true);
|
||||
unitKeyWordAc.setOutputMarkupId(true);
|
||||
areaKeyWordAc.setOutputMarkupId(true);
|
||||
add(titleField.setOutputMarkupId(true));
|
||||
add(createKeywordAC("regKeyWordAC", KeywordTypeDao.TYPE.REGULAR, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
|
||||
add(createKeywordAC("unitKeyWordAC", KeywordTypeDao.TYPE.UNIT, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
|
||||
add(createKeywordAC("areaKeyWordAC", KeywordTypeDao.TYPE.RESEARCH_AREA, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
|
||||
|
||||
final CustomDateTimeField dateFrom = new CustomDateTimeField("dateFrom", new Model<Date>(getDateSixMonthsAgo()));
|
||||
final CustomDateTimeField dateTo = new CustomDateTimeField("dateTo", new Model<Date>(Calendar.getInstance().getTime()));
|
||||
add(titleField);
|
||||
add(regKeyWordAc);
|
||||
add(unitKeyWordAc);
|
||||
add(areaKeyWordAc);
|
||||
WebMarkupContainer container = new WebMarkupContainer("container");
|
||||
container.add(dateFrom);
|
||||
container.add(dateTo);
|
||||
add(container);
|
||||
add(new WebMarkupContainer("container").add(dateFrom).add(dateTo));
|
||||
final FilterFormProjectClassPanel projectClassPanel = new FilterFormProjectClassPanel("projectClassPanel", new ArrayList<ProjectClass>());
|
||||
add(projectClassPanel);
|
||||
AjaxButton filterButton = new AjaxButton("filterButton", new Model<String>("Filter")) {
|
||||
add(projectClassPanel.setOutputMarkupId(true));
|
||||
add(includeDeletedChbx.setOutputMarkupId(true));
|
||||
add(createFilterButton(params, titleField, projectClassPanel, keywords, emptyLabel, allContainer, allProvider, dateFrom, dateTo, totalProjectIdeas, feedBackPanel));
|
||||
add(new AjaxButton("clearSearchTermsButton") {
|
||||
|
||||
private static final long serialVersionUID = 443680343329839590L;
|
||||
@Override
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
@SuppressWarnings("unchecked") List<Keyword> keywordList = ((ListView) keyWordsContainer.get("keywordList")).getModelObject();
|
||||
if(keywordList != null && !keywordList.isEmpty()) {
|
||||
keywordList.clear();
|
||||
}
|
||||
titleField.setModelObject(null);
|
||||
projectClassPanel.getSelectedprojectClasses().clear();
|
||||
includeDeletedChbx.setDefaultModelObject(false);
|
||||
target.addComponent(includeDeletedChbx);
|
||||
target.addComponent(feedBackPanel);
|
||||
target.addComponent(keyWordsContainer);
|
||||
target.addComponent(titleField);
|
||||
target.addComponent(projectClassPanel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private ListView<Keyword> createKeywordListView(final WebMarkupContainer keyWordsContainer, final Component feedbackPanel) {
|
||||
return new ListView<Keyword>("keywordList", new Model<ArrayList<Keyword>>()) {
|
||||
private static final long serialVersionUID = 78442920410294688L;
|
||||
|
||||
@Override
|
||||
protected void populateItem(final ListItem<Keyword> keywordListItem) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
final Keyword keyword = keywordListItem.getModelObject();
|
||||
keywordListItem.add(new Label("keyWord",keyword.getKeyword()));
|
||||
keywordListItem.add(new Label("isDeleted", " keyword is inactive ") {
|
||||
private static final long serialVersionUID = -8762949529390464842L;
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return keyword.isDeleted();
|
||||
}
|
||||
});
|
||||
|
||||
keywordListItem.add(new Label("keyWordType",keyword.getType().getName()));
|
||||
|
||||
AjaxActionIcon deleteKeyWordIcon = new AjaxActionIcon("deleteKeyWordIcon", ImageObject.SIXTEEN + ImageObject.DELETE){
|
||||
private static final long serialVersionUID = -8732262906336014797L;
|
||||
|
||||
@Override
|
||||
protected void onClick(AjaxRequestTarget target) {
|
||||
keywordListItem.remove();
|
||||
Session.get().info("Removed the keyword " + keyword + " from the search terms.");
|
||||
@SuppressWarnings("unchecked") final List<Keyword> keywordList = ((ListView) keyWordsContainer.get("keywordList")).getModelObject();
|
||||
if(keywordList.contains(keyword)) {
|
||||
keywordList.remove(keyword);
|
||||
}
|
||||
target.addComponent(keyWordsContainer);
|
||||
target.addComponent(feedbackPanel);
|
||||
}
|
||||
};
|
||||
deleteKeyWordIcon.add(new JavascriptEventConfirmation("onclick", "Are you sure you want to delete the keyword " + keyword + "?"));
|
||||
keywordListItem.add(deleteKeyWordIcon);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private AjaxButton createFilterButton(final Params params, final TextField<String> titleField, final FilterFormProjectClassPanel projectClassPanel,
|
||||
final List<Keyword> keywords, final Label emptyLabel, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
|
||||
final CustomDateTimeField dateFrom, final CustomDateTimeField dateTo, final Label totalProjectIdeas, final Component feedBackPanel) {
|
||||
return new AjaxButton("filterButton", new Model<String>("Filter")) {
|
||||
private static final long serialVersionUID = 874722659774465502L;
|
||||
|
||||
@Override
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
params.setTitleContains(titleField.getModelObject());
|
||||
params.setTitleContains(titleField.getModelObject() != null ? titleField.getModelObject() : "");
|
||||
List<ProjectClass> pclasses = projectClassPanel.getSelectedprojectClasses();
|
||||
if (!pclasses.isEmpty()) {
|
||||
params.setProjectClasses(pclasses);
|
||||
} else if(params.getProjectClasses() == null || params.getProjectClasses().size() == 0) {
|
||||
addProjectClasses(params);
|
||||
}
|
||||
|
||||
if(!keywords.isEmpty()) {
|
||||
params.setKeywords(keywords);
|
||||
params.setKeywords(keywords); // there should always be a project class, we may otherwise get an NPE when we clear() in clearSearchTermsButton#onSubmit
|
||||
for(Keyword keyword : keywords) {
|
||||
if(keyword.isDeleted()) {
|
||||
params.setIncludeDeleted(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
params.setSubmittedAfter(dateFrom.getModelObject());
|
||||
params.setSubmittedBefore(dateTo.getModelObject());
|
||||
@ -305,21 +427,18 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
|
||||
allContainer.replace(new Label("totalProjectIdeas", Integer.toString(allProvider.size())));
|
||||
target.addComponent(totalProjectIdeas);
|
||||
target.addComponent(allContainer);
|
||||
target.addComponent(feedBackPanel);
|
||||
}
|
||||
};
|
||||
add(filterButton);
|
||||
add(new AjaxButton("clearSearchTermsButton") {
|
||||
|
||||
private static final long serialVersionUID = 443680343329839590L;
|
||||
@Override
|
||||
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
|
||||
((ListView) keyWordsContainer.get("keywordList")).setModelObject(null);
|
||||
titleField.setModelObject(null);
|
||||
target.addComponent(keyWordsContainer);
|
||||
target.addComponent(titleField);
|
||||
//projectClassPanel => för att noll-ställa
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void addProjectClasses(Params params) {
|
||||
Collection<ProjectClass> projectClassCollection = new ArrayList<ProjectClass>();
|
||||
ProjectClass projectClass = projectClassDao.getProjectClass(ProjectClass.BACHELOR);
|
||||
projectClassCollection.add(projectClass);
|
||||
projectClass = projectClassDao.getProjectClass(ProjectClass.MASTER);
|
||||
projectClassCollection.add(projectClass);
|
||||
params.setProjectClasses(projectClassCollection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
<!-- 2nd level cache -->
|
||||
<property name="hibernate.cache.provider_class"
|
||||
value="org.hibernate.cache.SingletonEhCacheProvider"/>
|
||||
<!--<property name="hibernate.hbm2ddl.auto" value="update" />-->
|
||||
<property name="net.sf.ehcache.configurationResourceName"
|
||||
value="/ehcache.xml"/>
|
||||
<property name="hibernate.cache.use_query_cache" value="true"/>
|
||||
|
@ -1,31 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<!-- The contents of this file will be loaded for each web application -->
|
||||
<Context privileged="true" distributable="1" reloadable="1" debug="1">
|
||||
|
||||
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
|
||||
<!--
|
||||
<Manager pathname="" />
|
||||
-->
|
||||
|
||||
<!-- Uncomment this to enable Comet connection tacking (provides events
|
||||
on session expiration as well as webapp lifecycle) -->
|
||||
<!--
|
||||
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
|
||||
-->
|
||||
</Context>
|
Loading…
x
Reference in New Issue
Block a user