From f33956068def43c3b98a806407b622ca2103ffe5 Mon Sep 17 00:00:00 2001 From: Tom Zhao <tom.zhao@dsv.su.se> Date: Thu, 20 Mar 2025 09:18:39 +0100 Subject: [PATCH] 87: Add initial view for splitting project --- .../admin/pages/AdminEditProjectPage.html | 3 + .../admin/pages/AdminEditProjectPage.java | 36 +++++++-- .../admin/pages/AdminSplitProjectPanel.html | 15 ++++ .../admin/pages/AdminSplitProjectPanel.java | 80 +++++++++++++++++++ .../AdminSplitProjectPanel.utf8.properties | 1 + 5 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.html create mode 100644 view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.java create mode 100644 view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.utf8.properties diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.html b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.html index 4f18134263..ef96d30cfa 100644 --- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.html +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.html @@ -49,6 +49,9 @@ </form> </div> </div> + + <wicket:container wicket:id="splitPanel"/> + </wicket:extend> </body> </html> diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.java b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.java index d34c954c7f..6e93e74617 100644 --- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.java +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminEditProjectPage.java @@ -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> { diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.html b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.html new file mode 100644 index 0000000000..0aedf51684 --- /dev/null +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.html @@ -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> \ No newline at end of file diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.java b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.java new file mode 100644 index 0000000000..b8bcaf413b --- /dev/null +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.java @@ -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; + } + } +} diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.utf8.properties b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.utf8.properties new file mode 100644 index 0000000000..dbea6689ec --- /dev/null +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPanel.utf8.properties @@ -0,0 +1 @@ +splitButton = Split ProjectX \ No newline at end of file