From 8266b1f1fe0d403282d5c51f3d2d9c8b2f0e02ee Mon Sep 17 00:00:00 2001
From: Tom Zhao <tom.zhao@dsv.su.se>
Date: Thu, 27 Mar 2025 11:48:34 +0100
Subject: [PATCH] 87: Improve result page (AdminViewParentProjectPage) after
 split

---
 .../split/SplitOrRestartProjectService.java   |  3 ++
 .../SplitOrRestartProjectServiceImpl.java     | 12 ++++-
 .../admin/pages/AdminSplitProjectPage.java    |  2 -
 .../pages/AdminViewParentProjectPage.html     |  7 ++-
 .../pages/AdminViewParentProjectPage.java     | 51 +++++++++++++++++++
 5 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectService.java b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectService.java
index e2fc88005c..d11626a0a0 100644
--- a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectService.java
+++ b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectService.java
@@ -1,5 +1,6 @@
 package se.su.dsv.scipro.project.split;
 
+import java.util.List;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.util.Pair;
 
@@ -25,4 +26,6 @@ public interface SplitOrRestartProjectService {
     Pair<SplittableStatus, Project> getSplittableStatus(long projectId);
 
     void splitProject(long projectId);
+
+    List<Project> getChildProjects(long parentProjectId);
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
index 7937045a58..0b5bc53f82 100644
--- a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
@@ -1,5 +1,6 @@
 package se.su.dsv.scipro.project.split;
 
+import com.querydsl.core.types.dsl.BooleanExpression;
 import jakarta.inject.Inject;
 import jakarta.transaction.Transactional;
 import java.util.List;
@@ -7,6 +8,7 @@ import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.project.ProjectService;
 import se.su.dsv.scipro.project.ProjectStatus;
+import se.su.dsv.scipro.project.QProject;
 import se.su.dsv.scipro.system.User;
 import se.su.dsv.scipro.util.Pair;
 
@@ -78,14 +80,20 @@ public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectSe
                 project.getRootProjectId() != null ? project.getRootProjectId() : project.getId()
             );
 
+            // Todo: add RoughDraftApproval if it's 'APPROVED'
+
             childProject = projectService.save(childProject);
-            // Todo: Send event to eventBus to synchronize eventual Phase Two Approval
+            // Todo: Send event to eventBus to synchronize eventual Phase Two Approval with MileStone
         }
 
         // Parent project will set as inactive
         project.setProjectStatus(ProjectStatus.INACTIVE);
         projectService.save(project);
+    }
 
-        System.out.println("Hello, split project -> " + projectId);
+    @Override
+    @Transactional
+    public List<Project> getChildProjects(long parentProjectId) {
+        return projectService.findAll(QProject.project.rootProjectId.eq(parentProjectId));
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPage.java b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPage.java
index 6a0d779fbb..5ec65d6b52 100644
--- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminSplitProjectPage.java
@@ -73,8 +73,6 @@ public class AdminSplitProjectPage extends AbstractAdminProjectPage implements M
         protected void onSubmit() {
             Long projectId = getModel().getObject().getId();
 
-            System.out.println("Project ID: " + projectId);
-
             splitOrRestartProjectService.splitProject(projectId);
 
             final PageParameters pp = new PageParameters();
diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.html b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.html
index 7cdd694718..c7f6ecaa59 100644
--- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.html
+++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.html
@@ -4,14 +4,13 @@
 <wicket:extend>
     <div class="row">
         <div class="col-lg-5">
-            <h4>Hahahaha</h4>
+            <h4 wicket:id="projectTitle"></h4>
 
             <p>The project has following children projects:</p>
 
             <div class="mb-3">
-                <ul>
-                    <li>Abcd</li>
-                    <li>efbud</li>
+                <ul wicket:id="projectList">
+                    <li><a wicket:id="editLink"></a></li>
                 </ul>
             </div>
 
diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.java b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.java
index 56c1ed8e4e..36ec634056 100644
--- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminViewParentProjectPage.java
@@ -1,17 +1,68 @@
 package se.su.dsv.scipro.admin.pages;
 
+import jakarta.inject.Inject;
+import java.util.List;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightAdminProjectManagement;
+import se.su.dsv.scipro.project.Project;
+import se.su.dsv.scipro.project.ProjectService;
+import se.su.dsv.scipro.project.split.SplitOrRestartProjectService;
 import se.su.dsv.scipro.security.auth.Authorization;
 import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.util.PageParameterKeys;
 
 @Authorization(authorizedRoles = { Roles.SYSADMIN })
 public class AdminViewParentProjectPage
     extends AbstractAdminProjectPage
     implements MenuHighlightAdminProjectManagement {
 
+    @Inject
+    private ProjectService projectService;
+
+    @Inject
+    private SplitOrRestartProjectService splitOrRestartProjectService;
+
     public AdminViewParentProjectPage(PageParameters pp) {
+        final long id = pp.get(PageParameterKeys.MAP.get(Project.class)).toLong(0);
+        final Project project = projectService.findOne(id);
+        if (project == null) {
+            throw new RestartResponseException(AdminCreateProjectPage.class);
+        }
+
+        add(new Label("projectTitle", Model.of(project.getTitle())));
+
+        LoadableDetachableModel<List<Project>> ldModel = LoadableDetachableModel.of(() ->
+            splitOrRestartProjectService.getChildProjects(id)
+        );
+
+        add(
+            new ListView<>("projectList", ldModel) {
+                @Override
+                protected void populateItem(ListItem<Project> item) {
+                    Project project = item.getModelObject();
+
+                    final PageParameters pp = new PageParameters();
+                    pp.set(PageParameterKeys.MAP.get(Project.class), project.getId());
+
+                    BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>(
+                        "editLink",
+                        AdminEditProjectPage.class,
+                        pp
+                    );
+                    link.setBody(Model.of(project.getTitle() + " - " + project.getAuthorNames()));
+
+                    item.add(link);
+                }
+            }
+        );
+
         add(new BookmarkablePageLink<Void>("link", ProjectManagementPage.class));
     }
 }