87: Add initial view for splitting project

This commit is contained in:
Tom Zhao 2025-03-20 09:18:39 +01:00
parent 23e0a7f5ea
commit f33956068d
5 changed files with 129 additions and 6 deletions

@ -49,6 +49,9 @@
</form>
</div>
</div>
<wicket:container wicket:id="splitPanel"/>
</wicket:extend>
</body>
</html>

@ -2,15 +2,24 @@ package se.su.dsv.scipro.admin.pages;
import com.google.common.eventbus.EventBus;
import jakarta.inject.Inject;
import java.time.LocalDate;
import java.util.*;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.LambdaChoiceRenderer;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LambdaModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import se.su.dsv.scipro.components.*;
import se.su.dsv.scipro.components.AutoCompleteRoleProvider;
import se.su.dsv.scipro.components.BootstrapDatePicker;
import se.su.dsv.scipro.components.DatesValidator;
import se.su.dsv.scipro.components.DefaultSelect2MultiChoice;
import se.su.dsv.scipro.components.ResearchAreaChoiceRenderer;
import se.su.dsv.scipro.components.ResearchAreasModel;
import se.su.dsv.scipro.components.SupervisorAutoComplete;
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightAdminProjectManagement;
import se.su.dsv.scipro.data.DetachableServiceModel;
import se.su.dsv.scipro.data.DetachableServiceModelCollection;
@ -26,9 +35,21 @@ import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.project.ReviewerAssignedEvent;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.system.*;
import se.su.dsv.scipro.system.ProjectType;
import se.su.dsv.scipro.system.ProjectTypeService;
import se.su.dsv.scipro.system.ResearchArea;
import se.su.dsv.scipro.system.ResearchAreaService;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.system.UserSearchService;
import se.su.dsv.scipro.system.UserService;
import se.su.dsv.scipro.util.PageParameterKeys;
import java.time.LocalDate;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.TreeSet;
@Authorization(authorizedRoles = { Roles.SYSADMIN })
public class AdminEditProjectPage extends AbstractAdminProjectPage implements MenuHighlightAdminProjectManagement {
@ -74,7 +95,10 @@ public class AdminEditProjectPage extends AbstractAdminProjectPage implements Me
if (project == null) {
throw new RestartResponseException(AdminCreateProjectPage.class);
}
add(new ProjectForm(FORM, new DetachableServiceModel<>(projectService, project)));
DetachableServiceModel<Project> dsModel = new DetachableServiceModel<>(projectService, project);
add(new ProjectForm(FORM, dsModel));
add(new AdminSplitProjectPanel("splitPanel", dsModel));
}
private class ProjectForm extends Form<Project> {

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<div class="row mt-5">
<div class="col-md-12 col-lg-8 col-xl-5">
<p>
<a class="btn" wicket:id="splitProjectLink"><wicket:message key="splitButton" /></a>
</p>
<p wicket:id="splitInfo"></p>
</div>
</div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,80 @@
package se.su.dsv.scipro.admin.pages;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.project.ProjectStatus;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.session.SciProSession;
public class AdminSplitProjectPanel extends Panel {
private enum SplittableStatus {
NOT_ACTIVE, NOT_TWO_PARTICIPANTS, FINAL_SEMINAR_PHASE_STARTED, OK
}
public AdminSplitProjectPanel(String id, final IModel<Project> projectModel) {
super(id, projectModel);
Project project = projectModel.getObject();
SplittableStatus splittableStatus = getSplitStatus(project);
AbstractLink splitProjectLink = new BookmarkablePageLink<Void>("splitProjectLink", AdminCreateProjectPage.class) {
@Override
protected void onConfigure() {
super.onConfigure();
if (splittableStatus == SplittableStatus.OK) {
setEnabled(true);
this.add(new AttributeAppender("class", Model.of(" btn-success")));
} else {
setEnabled(false);
this.add(new AttributeAppender("class", Model.of(" btn-secondary disabled")));
}
}
};
add(splitProjectLink);
if (splittableStatus == SplittableStatus.NOT_TWO_PARTICIPANTS) {
add(new Label("splitInfo", Model.of("To be able to split a project, it needs to have 2 participants.")));
} else if (splittableStatus == SplittableStatus.NOT_ACTIVE) {
add(new Label("splitInfo", Model.of("Only active project can be split.")));
} else {
add(new Label("splitInfo", Model.of("")));
}
/*
Label splitInfoLabel = new Label("splitInfoLabel", dsModel) {
@Override
protected void onConfigure() {
super.onConfigure();
Project attachedProject = dsModel.getObject();
if (attachedProject.getProjectParticipants().size() < 2) {
this
}
}
};
*/
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisibilityAllowed(SciProSession.get().authorizedForRole(Roles.ADMIN));
}
private SplittableStatus getSplitStatus(final Project project) {
if (project.getProjectParticipants().size() != 2) {
return SplittableStatus.NOT_TWO_PARTICIPANTS;
} else if (project.getProjectStatus() != ProjectStatus.ACTIVE) {
return SplittableStatus.NOT_ACTIVE;
} else {
return SplittableStatus.OK;
}
}
}

@ -0,0 +1 @@
splitButton = Split ProjectX