From e84fc37cf68aab4372543e6c9c980678c6f9653e Mon Sep 17 00:00:00 2001
From: Tom Zhao <tom.zhao@dsv.su.se>
Date: Thu, 30 Jan 2025 10:11:14 +0100
Subject: [PATCH] 97: Update supervisor view related code to reflect the latest
 grading criterions

---
 .../su/dsv/scipro/grading/TemplatePanel.html  | 260 +++++++++++-------
 .../su/dsv/scipro/grading/TemplatePanel.java  |  44 ++-
 2 files changed, 204 insertions(+), 100 deletions(-)

diff --git a/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.html b/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.html
index 10a08fca07..06a3492e70 100644
--- a/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.html
+++ b/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.html
@@ -2,156 +2,226 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
 <body>
 <wicket:panel>
-    <wicket:container wicket:id="from2017">
-    <div wicket:id="bachelorContainer">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande schema:</strong>
-                </p>
+    <wicket:container wicket:id="from202411">
+        <div wicket:id="bachelorContainer"><!-- todo ! -->
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande schema: (varför svenska här?)</strong>
+                    </p>
 
-                <p>[A] 28-26, at least 1 point on components U1-U12 and Ö1-Ö4, Ö6</p>
+                    <p>[A] 31-29, at least 1 point on components U1-U12 and Ö1-Ö4, Ö6?</p>
 
-                <p>[B] 25-24, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+                    <p>[B] 28-26, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6?</p>
 
-                <p>[C] 23-20, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+                    <p>[C] 25-22, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6?</p>
 
-                <p>[D] 19-18, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+                    <p>[D] 21-19, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6?</p>
 
-                <p>[E] 17-16, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+                    <p>[E] 18-16, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6?</p>
 
-                <p>[Fx] at least 1 point on 8 of the components U1-U12 and at least 2 points altogether on components
-                    Ö1-Ö3
-                </p>
+                    <p>[Fx] ???at least 1 point on 8 of the components U1-U12 and at least 2 points altogether on components
+                        Ö1-Ö3???
+                    </p>
+                </div>
             </div>
         </div>
-    </div>
 
-    <div wicket:id="master15Container">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>Conversion from points to grades is done according to the following schema:</strong>
-                </p>
+        <div wicket:id="master15Container"><!-- todo ! -->
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Conversion from points to grades is done according to the following schema:</strong>
+                    </p>
 
-                <p>[A] 29-27, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö4, Ö6, and at least 2 points on U8-U9</p>
+                    <p>[A] 33-31, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö4, Ö6, and at least 2 points on U8-U9?</p>
 
-                <p>[B] 26-25, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+                    <p>[B] 30-28, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9?</p>
 
-                <p>[C] 24-23, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+                    <p>[C] 27-24, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9?</p>
 
-                <p>[D] 22-21, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+                    <p>[D] 23-21, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9?</p>
 
-                <p>[E] 20-19, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+                    <p>[E] 20-19, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9?</p>
 
-                <p>[Fx] at least 1 point on 10 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3</p>
+                    <p>[Fx] ???at least 1 point on 10 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3???</p>
+                </div>
             </div>
         </div>
-    </div>
 
-    <div wicket:id="master30Container">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>Conversion from points to grades is done according to the following schema:</strong>
-                    <span class="text-body-secondary">Updated 2017-02-20</span>
-                </p>
+        <div wicket:id="master30Container"><!-- todo ! -->
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Conversion from points to grades is done according to the following schema:</strong>
+                    </p>
 
-                <p>[A] 33-31, at least 1 point on components U1-U4, U10-U12, Ö1-Ö4, Ö6, and at least 2 points on U5-U9, U13</p>
+                    <p>[A] 37-35, at least 1 point on components U1-U4, U10-U12, Ö1-Ö4, Ö6, and at least 2 points on U5-U9, U13?</p>
 
-                <p>[B] 30-29, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+                    <p>[B] 34-32, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13?</p>
 
-                <p>[C] 28-27, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+                    <p>[C] 31-28, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13?</p>
 
-                <p>[D] 26-25, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+                    <p>[D] 27-25, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13?</p>
 
-                <p>[E] 24-23, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+                    <p>[E] 25-23, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13?</p>
 
-                <p>[Fx] at least 1 point on 12 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3</p>
+                    <p>[Fx] ???at least 1 point on 12 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3???</p>
+                </div>
+            </div>
+        </div>
+    </wicket:container>
+
+    <wicket:container wicket:id="between2017_202410">
+        <div wicket:id="bachelorContainer">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande schema:</strong>
+                    </p>
+
+                    <p>[A] 28-26, at least 1 point on components U1-U12 and Ö1-Ö4, Ö6</p>
+
+                    <p>[B] 25-24, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+
+                    <p>[C] 23-20, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+
+                    <p>[D] 19-18, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+
+                    <p>[E] 17-16, at least 1 point on components U1-U12 and Ö1-Ö3, Ö6</p>
+
+                    <p>[Fx] at least 1 point on 8 of the components U1-U12 and at least 2 points altogether on components
+                        Ö1-Ö3
+                    </p>
+                </div>
+            </div>
+        </div>
+
+        <div wicket:id="master15Container">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Conversion from points to grades is done according to the following schema:</strong>
+                    </p>
+
+                    <p>[A] 29-27, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö4, Ö6, and at least 2 points on U8-U9</p>
+
+                    <p>[B] 26-25, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+
+                    <p>[C] 24-23, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+
+                    <p>[D] 22-21, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+
+                    <p>[E] 20-19, at least 1 point on components U1-U7, U10-U13 and Ö1-Ö3, Ö6, and at least 2 points on U8-U9</p>
+
+                    <p>[Fx] at least 1 point on 10 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3</p>
+                </div>
+            </div>
+        </div>
+
+        <div wicket:id="master30Container">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>Conversion from points to grades is done according to the following schema:</strong>
+                        <span class="text-body-secondary">Updated 2017-02-20</span>
+                    </p>
+
+                    <p>[A] 33-31, at least 1 point on components U1-U4, U10-U12, Ö1-Ö4, Ö6, and at least 2 points on U5-U9, U13</p>
+
+                    <p>[B] 30-29, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+
+                    <p>[C] 28-27, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+
+                    <p>[D] 26-25, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+
+                    <p>[E] 24-23, at least 1 point on components U1-U4, U10-U12, Ö1-Ö3, Ö6, and at least 2 points on U5-U9, U13</p>
+
+                    <p>[Fx] at least 1 point on 12 of the components U1-U13 and at least 2 points altogether on components Ö1-Ö3</p>
+                </div>
             </div>
         </div>
-    </div>
     </wicket:container>
 
     <wicket:container wicket:id="upto2016">
-    <div wicket:id="bachelorContainer">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>
-                        Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
-                        schema:
-                    </strong>
-                </p>
+        <div wicket:id="bachelorContainer">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>
+                            Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
+                            schema:
+                        </strong>
+                    </p>
 
-                <p>[A] 27-25, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö4</p>
+                    <p>[A] 27-25, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö4</p>
 
-                <p>[B] 24-23, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
+                    <p>[B] 24-23, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
 
-                <p>[C] 22-19, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
+                    <p>[C] 22-19, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
 
-                <p>[D] 18-17, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
+                    <p>[D] 18-17, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
 
-                <p>[E] 16-15, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
+                    <p>[E] 16-15, minst 1 poäng på komponenterna U1-U12 samt Ö1-Ö3</p>
 
-                <p>[Fx] minst 1 poäng på åtta av komponenterna U1-U12 och minst två poäng sammanlagt på
-                    komponenterna Ö1-Ö3
-                </p>
+                    <p>[Fx] minst 1 poäng på åtta av komponenterna U1-U12 och minst två poäng sammanlagt på
+                        komponenterna Ö1-Ö3
+                    </p>
+                </div>
             </div>
         </div>
-    </div>
 
-    <div wicket:id="master15Container">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>
-                        Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
-                        schema:
-                    </strong>
-                </p>
+        <div wicket:id="master15Container">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>
+                            Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
+                            schema:
+                        </strong>
+                    </p>
 
-                <p>[A] 28-26, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö4, minst 2 poäng på U8-U9</p>
+                    <p>[A] 28-26, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö4, minst 2 poäng på U8-U9</p>
 
-                <p>[B] 25-24, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
+                    <p>[B] 25-24, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
 
-                <p>[C] 23-22, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
+                    <p>[C] 23-22, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
 
-                <p>[D] 21-20, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
+                    <p>[D] 21-20, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
 
-                <p>[E] 19-18, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
+                    <p>[E] 19-18, minst 1 poäng på komponenterna U1-U7, U10-U13 samt Ö1-Ö3, minst 2 poäng på U8-U9</p>
 
-                <p>[Fx] minst 1 poäng på tio av komponenterna U1-U13 och minst två poäng sammanlagt på komponenterna
-                    Ö1-Ö3</p>
+                    <p>[Fx] minst 1 poäng på tio av komponenterna U1-U13 och minst två poäng sammanlagt på komponenterna
+                        Ö1-Ö3</p>
+                </div>
             </div>
         </div>
-    </div>
 
-    <div wicket:id="master30Container">
-        <div class="card mb-3 bg-light">
-            <div class="card-body p-2">
-                <p>
-                    <strong>
-                        Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
-                        schema:
-                    </strong>
-                </p>
+        <div wicket:id="master30Container">
+            <div class="card mb-3 bg-light">
+                <div class="card-body p-2">
+                    <p>
+                        <strong>
+                            Omvandling från poäng till betyg för ett kandidatarbete görs enligt följande
+                            schema:
+                        </strong>
+                    </p>
 
-                <p>[A] 32-30, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö4, minst 2 poäng på U5-U9, U13</p>
+                    <p>[A] 32-30, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö4, minst 2 poäng på U5-U9, U13</p>
 
-                <p>[B] 29-28, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
+                    <p>[B] 29-28, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
 
-                <p>[C] 27-26, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
+                    <p>[C] 27-26, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
 
-                <p>[D] 25-24, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
+                    <p>[D] 25-24, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
 
-                <p>[E] 23-22, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
+                    <p>[E] 23-22, minst 1 poäng på komponenterna U1-U4, U10-U12, Ö1-Ö3, minst 2 poäng på U5-U9, U13</p>
 
-                <p>[Fx] minst 1 poäng på tolv av komponenterna U1-U13 och minst två poäng sammanlagt på komponenterna
-                    Ö1-Ö3</p>
+                    <p>[Fx] minst 1 poäng på tolv av komponenterna U1-U13 och minst två poäng sammanlagt på komponenterna
+                        Ö1-Ö3</p>
+                </div>
             </div>
         </div>
-    </div>
     </wicket:container>
 </wicket:panel>
 </body>
diff --git a/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.java b/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.java
index d314162b13..629f8fc67c 100644
--- a/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/grading/TemplatePanel.java
@@ -6,12 +6,32 @@ import org.apache.wicket.model.IModel;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.system.DegreeType;
 
+import java.time.LocalDate;
+
 public class TemplatePanel extends Panel {
 
     public static final String BACHELOR_CONTAINER = "bachelorContainer";
     public static final String MASTER_15_CONTAINER = "master15Container";
     public static final String MASTER_30_CONTAINER = "master30Container";
 
+    private enum GradingCategory {
+        UP_TO_2016,
+        BETWEEN_2017_202410,
+        FROM_202411;
+
+        public static GradingCategory fromProjectStartDate(LocalDate projectStartDate) {
+            int year = projectStartDate.getYear();
+            int month = projectStartDate.getMonthValue();
+
+            if (year < 2017) {
+                return UP_TO_2016;
+            } else {
+                return (year <= 2024 && month < 11) ? BETWEEN_2017_202410 : FROM_202411;
+            }
+
+        }
+    }
+
     public TemplatePanel(String id, final IModel<Project> projectIModel) {
         super(id, projectIModel);
         final DegreeType degreeType = projectIModel.getObject().getProjectType().getDegreeType();
@@ -20,20 +40,34 @@ public class TemplatePanel extends Panel {
             @Override
             protected void onConfigure() {
                 super.onConfigure();
-                setVisibilityAllowed(getYear(projectIModel.getObject()) < 2017);
+                setVisibilityAllowed(GradingCategory.fromProjectStartDate(projectIModel.getObject().getStartDate())
+                        == GradingCategory.UP_TO_2016);
             }
         };
         addTemplates(degreeType, upto16);
         add(upto16);
-        final WebMarkupContainer from2017 = new WebMarkupContainer("from2017") {
+
+        final WebMarkupContainer between2017_202410 = new WebMarkupContainer("between2017_202410") {
             @Override
             protected void onConfigure() {
                 super.onConfigure();
-                setVisibilityAllowed(getYear(projectIModel.getObject()) >= 2017);
+                setVisibilityAllowed(GradingCategory.fromProjectStartDate(projectIModel.getObject().getStartDate())
+                        == GradingCategory.BETWEEN_2017_202410);
             }
         };
-        addTemplates(degreeType, from2017);
-        add(from2017);
+        addTemplates(degreeType, between2017_202410);
+        add(between2017_202410);
+
+        final WebMarkupContainer from202411 = new WebMarkupContainer("from202411") {
+            @Override
+            protected void onConfigure() {
+                super.onConfigure();
+                setVisibilityAllowed(GradingCategory.fromProjectStartDate(projectIModel.getObject().getStartDate())
+                        == GradingCategory.FROM_202411);
+            }
+        };
+        addTemplates(degreeType, from202411);
+        add(from202411);
     }
 
     private void addTemplates(final DegreeType degreeType, final WebMarkupContainer container) {