From f61b2ea2d994398d9544cf77dd824af4295cc474 Mon Sep 17 00:00:00 2001
From: Martin Staehr <software@mstaehr.net>
Date: Sun, 16 Jun 2019 18:34:11 +0200
Subject: [PATCH] #111 add ability for docent to see all portfolio entries

docent can see who has shared a portfolio entry with him.
---
 .../controller/SubmissionController.java      |  4 +-
 .../submission/view/SubmissionService.java    |  9 +--
 .../webapp/portfolio/js/portfolio-docent.js   | 77 ++++++++++++++++++
 .../js/{portfolio.js => portfolio-student.js} | 21 +++--
 .../portfolio/show-portfolio-docent.jsp       | 78 +++++++++++++++++++
 ...rtfolio.jsp => show-portfolio-student.jsp} |  4 +-
 .../src/main/webapp/taglibs/Menu.jsp          |  9 ++-
 .../webapp/taglibs/js/unstructuredUpload.js   | 14 +++-
 .../webapp/taglibs/js/visibilityButton.js     | 13 ----
 9 files changed, 198 insertions(+), 31 deletions(-)
 create mode 100644 gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-docent.js
 rename gemeinsamforschen/src/main/webapp/portfolio/js/{portfolio.js => portfolio-student.js} (68%)
 create mode 100644 gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-docent.jsp
 rename gemeinsamforschen/src/main/webapp/portfolio/{show-portfolio.jsp => show-portfolio-student.jsp} (97%)

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
index e9dfc5ab..db3de801 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
@@ -197,11 +197,11 @@ public class SubmissionController implements ISubmission, HasProgress {
         return fullSubmissionList;
     }
 
-    public List<FullSubmission> getPublicSubmissions(Project project, FileRole fileRole) {
+    public List<FullSubmission> getProjectSubmissions(Project project, FileRole fileRole, Visibility visibility) {
         List<FullSubmission> fullSubmissionList = new ArrayList<>();
         connection.connect();
         String query = "SELECT * FROM fullsubmissions WHERE projectName= ? AND fileRole = ? and visibility = ?;";
-        VereinfachtesResultSet rs = connection.issueSelectStatement(query, project.getName(), fileRole.name(), Visibility.PUBLIC.name());
+        VereinfachtesResultSet rs = connection.issueSelectStatement(query, project.getName(), fileRole.name(), visibility);
         while (rs.next()) {
             fullSubmissionList.add(getFullSubmissionFromResultSet(rs));
         }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
index 28ca8233..a939e8bc 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
@@ -259,19 +259,18 @@ public class SubmissionService {
         }
         Project project = new Project(projectName);
         User user = new User(userEmail);
-        int groupId = groupDAO.getMyGroupId(user, project);
+        Integer groupId = groupDAO.getMyGroupId(user, project);
 
         List<FullSubmission> fullSubmissionList = new ArrayList<>();
 
         switch (visibility) {
             case DOCENT:
+            case PUBLIC:
+                fullSubmissionList = submissionController.getProjectSubmissions(project, FileRole.PORTFOLIO, visibility);
                 break;
             case GROUP:
                 fullSubmissionList = submissionController.getGroupSubmissions(project, groupId, FileRole.PORTFOLIO, visibility);
                 break;
-            case PUBLIC:
-                fullSubmissionList = submissionController.getPublicSubmissions(project, FileRole.PORTFOLIO);
-                break;
             case PERSONAL:
                 fullSubmissionList = submissionController.getPersonalSubmissions(user, project, FileRole.PORTFOLIO);
         }
@@ -279,9 +278,7 @@ public class SubmissionService {
         if (fullSubmissionList.isEmpty()) {
             return Response.status(Response.Status.NOT_FOUND).entity("No portfolio entries found").build();
         }
-
         return Response.ok(fullSubmissionList).build();
-
     }
 
 }
diff --git a/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-docent.js b/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-docent.js
new file mode 100644
index 00000000..20334154
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-docent.js
@@ -0,0 +1,77 @@
+let projectName;
+let currentVisibleButtonText;
+let possibleVisibleButtons = [];
+let sortedPortfolioEntries = [];
+let templateData = {};
+$(document).ready(function () {
+    projectName = $('#projectName').html().trim();
+    setupVisibilityButton();
+});
+
+function setupVisibilityButton() {
+    let queryParams = {
+        projectName: projectName,
+        visibility: 'DOCENT'
+    };
+    getPortfolioSubmissions(queryParams, function (response) {
+        if (response.error) {
+            templateData.possibleButtons = response;
+        } else {
+            for (let element of response) {
+                let key = element.userEmail ? 'Student: ' + element.userEmail : 'Gruppe: ' + element.groupId;
+                if (!sortedPortfolioEntries[key]) {
+                    sortedPortfolioEntries[key] = [];
+                }
+                sortedPortfolioEntries[key].push(element)
+            }
+            possibleVisibleButtons = Object.keys(sortedPortfolioEntries);
+            currentVisibleButtonText = possibleVisibleButtons[0];
+            let buttonData = [];
+            for (name of possibleVisibleButtons) {
+                buttonData.push({name: name});
+            }
+            templateData.possibleButtons = buttonData;
+            fillPortfolioEntries();
+        }
+    });
+}
+
+function fillPortfolioEntries() {
+    templateData.currentVisibleButtonText = currentVisibleButtonText;
+
+    let portfolioEntries = sortedPortfolioEntries[currentVisibleButtonText];
+    for (let element of portfolioEntries) {
+        element.scriptBegin = '<script>';
+        element.scriptEnd = '</script>';
+
+        if (element.userEmail) {
+            element.creator = element.userEmail;
+        } else {
+            element.creator = "Gruppe " + element.groupId;
+        }
+        element.timestampDateTimeFormat = new Date(element.timestamp).toLocaleString();
+    }
+    templateData.submissionList = portfolioEntries;
+    let tmpl = $.templates("#portfolioTemplate");
+    let html = tmpl.render(templateData);
+    $("#portfolioTemplateResult").html(html);
+
+
+}
+
+function visibilityButtonPressed(pressedButton) {
+    changeButtonText(pressedButton, fillPortfolioEntries);
+
+}
+
+function changeButtonText(clickedItem, callback) {
+    let dropBtn = $('.dropbtn');
+    let oldText = dropBtn.html();
+    let oldButtonText = currentVisibleButtonText;
+    currentVisibleButtonText = clickedItem;
+    let newText = oldText.replace(oldButtonText, currentVisibleButtonText);
+    dropBtn.html(newText);
+    if (callback) {
+        callback();
+    }
+}
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio.js b/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-student.js
similarity index 68%
rename from gemeinsamforschen/src/main/webapp/portfolio/js/portfolio.js
rename to gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-student.js
index b22f24b1..d802c417 100644
--- a/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio.js
+++ b/gemeinsamforschen/src/main/webapp/portfolio/js/portfolio-student.js
@@ -1,6 +1,6 @@
 let projectName;
 let possibleVisibilities = [];
-let currentVisibility;
+let currentVisibleButton;
 $(document).ready(function () {
     projectName = $('#projectName').html().trim();
     setupVisibilityButton();
@@ -11,10 +11,10 @@ function setupVisibilityButton() {
         Object.entries(response).forEach(([name, buttonText]) => {
             possibleVisibilities[name] = {name: name, buttonText: buttonText};
         });
-        currentVisibility = possibleVisibilities['PERSONAL'];
+        currentVisibleButton = possibleVisibilities['PERSONAL'];
         let data = {};
         data.possibleVisibilities = Object.values(possibleVisibilities);
-        data.currentVisibility = currentVisibility;
+        data.currentVisibility = currentVisibleButton;
         let tmpl = $.templates("#visibilityTemplate");
         let html = tmpl.render(data);
         $("#visibilityTemplateResult").html(html);
@@ -25,7 +25,7 @@ function setupVisibilityButton() {
 function fillPortfolioEntries() {
     let queryParams = {
         projectName: projectName,
-        visibility: currentVisibility.name
+        visibility: currentVisibleButton.name
     };
     getPortfolioSubmissions(queryParams, function (response) {
         let data = {};
@@ -35,7 +35,7 @@ function fillPortfolioEntries() {
         for (let element of response) {
             element.scriptBegin = data.scriptBegin;
             element.scriptEnd = data.scriptEnd;
-            element.timestamp = new Date(element.timestamp).toLocaleString();
+            element.timestampDateTimeFormat = new Date(element.timestamp).toLocaleString();
         }
         data.submissionList = response;
         data.error = response.error;
@@ -48,5 +48,16 @@ function fillPortfolioEntries() {
 
 function visibilityButtonPressed(pressedButton) {
     changeButtonText(pressedButton, fillPortfolioEntries);
+}
 
+function changeButtonText(clickedItem, callback) {
+    let dropBtn = $('.dropbtn');
+    let oldText = dropBtn.html();
+    let oldVisibility = currentVisibleButton;
+    currentVisibleButton = possibleVisibilities[clickedItem];
+    let newText = oldText.replace(oldVisibility.buttonText, currentVisibleButton.buttonText);
+    dropBtn.html(newText);
+    if (callback) {
+        callback();
+    }
 }
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-docent.jsp b/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-docent.jsp
new file mode 100644
index 00000000..5a98e6a7
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-docent.jsp
@@ -0,0 +1,78 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+
+<%--<%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="chat" %>--%>
+<!DOCTYPE html>
+<html>
+
+<head>
+    <jsp:include page="../taglibs/omniDependencies.jsp">
+        <jsp:param name="hierarchy" value="1"/>
+    </jsp:include>
+    <jsp:include page="../taglibs/quillJsDependencies.jsp"/>
+
+    <link rel="stylesheet" type="text/css" href="../taglibs/css/visibilityButton.css">
+    <link rel="stylesheet" type="text/css" href="css/show-portfolio.css">
+
+    <!-- js - jQuery ui position -->
+    <script src="../libs/jquery/jqueryUI.js" type="text/javascript"></script>
+
+    <!-- jsrender -->
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/1.0.3/jsrender.min.js"></script>
+
+    <!-- js - unstructuredRest -->
+    <script src="../taglibs/js/unstructuredRest.js"></script>
+    <script src="js/portfolio-docent.js"></script>
+    <script src="../taglibs/js/visibilityButton.js"></script>
+
+</head>
+
+<body>
+<div id="flex-wrapper">
+    <jsp:include page="../taglibs/Menu.jsp">
+        <jsp:param name="hierarchy" value="1"/>
+    </jsp:include>
+    <main>
+        <div class="row group">
+            <h1>E-Portfolio</h1>
+            <div id="portfolioTemplateResult"></div>
+            <script id="portfolioTemplate" type="text/x-jsrender">
+                <div></div>
+                    {{if possibleButtons.error}}
+                        <h2>Keine Einträge gefunden</h2>
+                    {{else}}
+                        <h4>Wähle, welche Beiträge du sehen möchtest</h4>
+                        <div class="dropdown">
+                            <button class="dropbtn btn btn-primary" onclick="dropDownClick()">{{:currentVisibleButtonText}}
+                            <i class="fa fa-caret-down"></i>
+                            </button>
+                            <div class="dropdown-content" id="myDropdown">
+                                {{for possibleButtons}}
+                                    <a id={{:name}} onclick='visibilityButtonPressed("{{:name}}")'>{{:name}}</a>
+                                {{/for}}
+                            </div>
+                        </div>
+                        <h3>Einträge</h3>
+                        {{for submissionList}}
+                            <br/>
+                            <div id="editor-{{:id}}"></div>
+                            {{:scriptBegin}}
+                            new Quill('#editor-{{:id}}', {
+                                theme: 'snow',
+                                readOnly: true,
+                                "modules": {
+                                    "toolbar": false
+                                }
+                            }).setContents({{:text}});
+                            {{:scriptEnd}}
+                            <h4 class="creation-information">{{:creator}} - {{:timestampDateTimeFormat}}</h4>
+                            <br/>
+                        {{/for}}
+                    {{/if}}
+
+            </script>
+        </div> <!-- flex wrapper -->
+    </main>
+    <jsp:include page="../taglibs/footer.jsp"/>
+</body>
+
+</html>
diff --git a/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio.jsp b/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-student.jsp
similarity index 97%
rename from gemeinsamforschen/src/main/webapp/portfolio/show-portfolio.jsp
rename to gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-student.jsp
index 4e7169f0..a88cc77d 100644
--- a/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio.jsp
+++ b/gemeinsamforschen/src/main/webapp/portfolio/show-portfolio-student.jsp
@@ -21,7 +21,7 @@
 
     <!-- js - unstructuredRest -->
     <script src="../taglibs/js/unstructuredRest.js"></script>
-    <script src="js/portfolio.js"></script>
+    <script src="js/portfolio-student.js"></script>
     <script src="../taglibs/js/visibilityButton.js"></script>
 
 </head>
@@ -67,7 +67,7 @@
                         }
                     }).setContents({{:text}});
                     {{:scriptEnd}}
-                    <h4 class="creation-information">{{:userEmail}} - {{:timestamp}}</h4>
+                    <h4 class="creation-information">{{:userEmail}} - {{:timestampDateTimeFormat}}</h4>
                     <br/>
                 {{/for}}
                 {{if error}}
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/Menu.jsp b/gemeinsamforschen/src/main/webapp/taglibs/Menu.jsp
index ea576be5..33a415a5 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/Menu.jsp
+++ b/gemeinsamforschen/src/main/webapp/taglibs/Menu.jsp
@@ -21,14 +21,19 @@
                href="<%= hierarchyLevel%>project/courses-student.jsp">Home</a>
             <a class="nav-link"
                href="<%= hierarchyLevel%>project/courses-student.jsp?all=true">Kurssuche</a>
+            <% if (projectName != null) {%>
+            <a class="nav-link"
+               href="<%=hierarchyLevel%>portfolio/show-portfolio-student.jsp?projectName=<%=projectName%>">E-Portfolio</a>
+            <% } %>
             <% } else {%>
             <a class="nav-link"
                href="<%= hierarchyLevel%>project/overview-docent.jsp">Projekte</a>
-            <% } %>
             <% if (projectName != null) {%>
             <a class="nav-link"
-               href="<%=hierarchyLevel%>portfolio/show-portfolio.jsp?projectName=<%=projectName%>">E-Portfolio</a>
+               href="<%=hierarchyLevel%>portfolio/show-portfolio-docent.jsp?projectName=<%=projectName%>">E-Portfolio</a>
+            <% } %>
             <% } %>
+
             <!--<a class="nav-link" href="<%= hierarchyLevel%>profile/profile.jsp?">Profil</a>-->
         </div>
         <div class="nav-group-right">
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/unstructuredUpload.js b/gemeinsamforschen/src/main/webapp/taglibs/js/unstructuredUpload.js
index e01446bc..00d00621 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/js/unstructuredUpload.js
+++ b/gemeinsamforschen/src/main/webapp/taglibs/js/unstructuredUpload.js
@@ -37,7 +37,7 @@ $(document).ready(function () {
                     projectName: $('#projectName').text().trim(),
                     personal: personal,
                     fileRole: fileRole.toUpperCase(),
-                    visibility: currentVisibility.name
+                    visibility: currentVisibleButtonText.name
                 };
 
                 // save request in database
@@ -109,3 +109,15 @@ function populateTextFields() {
     let html = tmpl.render(data);
     $("#visibilityTemplateResult").html(html);
 }
+
+function changeButtonText(clickedItem, callback) {
+    let dropBtn = $('.dropbtn');
+    let oldText = dropBtn.html();
+    let oldVisibility = currentVisibility;
+    currentVisibility = possibleVisibilities[clickedItem];
+    let newText = oldText.replace(oldVisibility.buttonText, currentVisibility.buttonText);
+    dropBtn.html(newText);
+    if (callback) {
+        callback();
+    }
+}
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/visibilityButton.js b/gemeinsamforschen/src/main/webapp/taglibs/js/visibilityButton.js
index 9c734f79..1c898acd 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/js/visibilityButton.js
+++ b/gemeinsamforschen/src/main/webapp/taglibs/js/visibilityButton.js
@@ -1,16 +1,3 @@
-function changeButtonText(clickedItem, callback) {
-    let dropBtn = $('.dropbtn');
-    let oldText = dropBtn.html();
-    let oldVisibility = currentVisibility;
-    currentVisibility = possibleVisibilities[clickedItem];
-    let newText = oldText.replace(oldVisibility.buttonText, currentVisibility.buttonText);
-    dropBtn.html(newText);
-    if (callback) {
-        callback();
-    }
-}
-
-
 function dropDownClick() {
     $('#myDropdown').toggleClass('show');
 }
-- 
GitLab