From b58a8a2d8b5e105686fe09d4f33b26c9445a94bf Mon Sep 17 00:00:00 2001
From: Tom Zhao <tom.zhao@dsv.su.se>
Date: Mon, 25 Nov 2024 15:20:28 +0100
Subject: [PATCH] 3470: Show tooltip if there are unread messages

* AbstractReadStatePanel is expanded with option to show tooltip.
---
 .../forum/panels/AbstractReadStatePanel.java  | 24 ++++++++++++++++---
 .../AbstractReadStatePanel.utf8.properties    |  1 +
 .../panels/SupervisorMyProjectsPanel.java     |  2 +-
 3 files changed, 23 insertions(+), 4 deletions(-)
 create mode 100644 view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.utf8.properties

diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.java
index 25eea67afa..f6344d1afc 100644
--- a/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.java
@@ -11,10 +11,24 @@ import java.util.Optional;
 
 public abstract class AbstractReadStatePanel extends Panel {
 
+    public static final String TOGGLE = "toggle";
+    static final String ICON = "icon";
+
+    public enum ShowReadStateTooltip {
+        ENABLED,
+        DISABLED
+    }
+
     private final Component icon;
+    private final ShowReadStateTooltip showReadStateTooltip;
 
     public AbstractReadStatePanel(final String id) {
+        this(id, ShowReadStateTooltip.DISABLED);
+    }
+
+    public AbstractReadStatePanel(final String id, final ShowReadStateTooltip showReadStateTooltip) {
         super(id);
+        this.showReadStateTooltip = showReadStateTooltip;
 
         AjaxFallbackLink<Void> link = new AjaxFallbackLink<>(TOGGLE) {
             @Override
@@ -35,11 +49,11 @@ public abstract class AbstractReadStatePanel extends Panel {
     protected abstract boolean isRead();
     protected abstract void onFlagClick(final AjaxRequestTarget target);
 
-    public static final String TOGGLE = "toggle";
-    static final String ICON = "icon";
+    public ShowReadStateTooltip getShowReadStateTooltip() {
+        return showReadStateTooltip;
+    }
 
     private class UpdatingImage extends WebComponent {
-
         public UpdatingImage(String id) {
             super(id);
         }
@@ -49,6 +63,10 @@ public abstract class AbstractReadStatePanel extends Panel {
             super.onComponentTag(tag);
             String state = isRead() ? "read" : "unread";
             tag.append("class", state, " ");
+
+            if (getShowReadStateTooltip() == ShowReadStateTooltip.ENABLED && !isRead()) {
+                tag.put("title", getString("unread.msg"));
+            }
         }
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.utf8.properties b/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.utf8.properties
new file mode 100644
index 0000000000..e86f4d6e50
--- /dev/null
+++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/AbstractReadStatePanel.utf8.properties
@@ -0,0 +1 @@
+unread.msg=There are unread messages.
\ No newline at end of file
diff --git a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java
index e3cab053eb..823db59cde 100755
--- a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java
@@ -194,7 +194,7 @@ public class SupervisorMyProjectsPanel extends Panel {
 
         @Override
         public void populateItem(Item<ICellPopulator<Project>> item, String id, IModel<Project> projectModel) {
-            item.add(new AbstractReadStatePanel(id) {
+            item.add(new AbstractReadStatePanel(id, AbstractReadStatePanel.ShowReadStateTooltip.ENABLED) {
                 @Override
                 protected boolean isRead() {
                     return !projectForumService.hasUnreadThreads(