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