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