Index: lams_tool_preview/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r58de3acfcde3052a939146df7d0172599e56633a -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 58de3acfcde3052a939146df7d0172599e56633a) +++ lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -193,4 +193,9 @@ email.label.feedback=Feedback from group members for {0}: email.label.self.rating=Self rating email.label.peers.ratng=Peers + +label.email.preview=Email Preview +button.preview.results =View / Email Results +label.hide =Hide +label.email.send.failed.preview.wrong=Sending failed - preview cannot be sent. Please create a new preview. #======= End labels: Exported 166 labels for en AU ===== Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dto/EmailPreviewDTO.java =================================================================== diff -u --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dto/EmailPreviewDTO.java (revision 0) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/dto/EmailPreviewDTO.java (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -0,0 +1,45 @@ +package org.lamsfoundation.lams.tool.peerreview.dto; + +public class EmailPreviewDTO { + private Long dateTimeStamp; + private String emailHTML; + private Long toolSessionId; + private Long learnerUserId; + + public EmailPreviewDTO(String emailHTML, Long toolSessionId, Long learnerUserId) { + this.emailHTML = emailHTML; + this.toolSessionId = toolSessionId; + this.learnerUserId = learnerUserId; + this.dateTimeStamp = System.currentTimeMillis(); + } + public String getEmailHTML() { + return emailHTML; + } + public void setEmailHTML(String emailHTML) { + this.emailHTML = emailHTML; + } + public Long getToolSessionId() { + return toolSessionId; + } + public void setToolSessionId(Long toolSessionId) { + this.toolSessionId = toolSessionId; + } + public Long getLearnerUserId() { + return learnerUserId; + } + public void setLearnerUserId(Long learnerUserId) { + this.learnerUserId = learnerUserId; + } + public Long getDateTimeStamp() { + return dateTimeStamp; + } + public void setDateTimeStamp(Long dateTimeStamp) { + this.dateTimeStamp = dateTimeStamp; + } + @Override + public String toString() { + return "EmailPreviewDTO [dateTimeStamp=" + dateTimeStamp + ", toolSessionId=" + toolSessionId + + ", learnerUserId=" + learnerUserId + "]"; + } + +} Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java =================================================================== diff -u -r0e58fb8d29c6847e4e810be22d439f61115398d8 -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision 0e58fb8d29c6847e4e810be22d439f61115398d8) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -310,11 +310,14 @@ */ List getPagedUsers(Long toolSessionId, Integer page, Integer size, int sorting, String searchString); + /** Generate and return the email that would be sent to a learner. Used to preview the email */ + String generateEmailReportToUser(Long toolContentId, Long sessionId, Long userId); + /** Send an email with the user's results to each user in the session */ int emailReportToSessionUsers(Long toolContentId, Long sessionId); - /** Send an email with the user's results to the specified user in the session */ - int emailReportToUser(Long toolContentId, Long sessionId, Long userId); + /** Send an email (generated previously with generateEmailReportToUser()) to the specified user in the session */ + int emailReportToUser(Long toolContentId, Long sessionId, Long userId, String emailReportToUser); /** Spreadsheet */ LinkedHashMap exportTeamReportSpreadsheet(Long toolContentId); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java =================================================================== diff -u -r4972b394013bef3bc563652df80d9c2dbb04e238 -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision 4972b394013bef3bc563652df80d9c2dbb04e238) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -464,18 +464,27 @@ } @Override - public int emailReportToUser(Long toolContentId, Long sessionId, Long userId) { + public String generateEmailReportToUser(Long toolContentId, Long sessionId, Long userId) { PeerreviewSession session = peerreviewSessionDao.getSessionBySessionId(sessionId); Peerreview peerreview = getPeerreviewByContentId(toolContentId); - - String email = new EmailAnalysisBuilder(peerreview, session, ratingService, peerreviewSessionDao, + return new EmailAnalysisBuilder(peerreview, session, ratingService, peerreviewSessionDao, peerreviewUserDao, this, messageService).generateHTMLEMailForLearner(userId); - eventNotificationService.sendMessage(null, userId.intValue(), IEventNotificationService.DELIVERY_METHOD_MAIL, - getResultsEmailSubject(peerreview), email, true); - return 1; } @Override + public int emailReportToUser(Long toolContentId, Long sessionId, Long userId, String email) { + PeerreviewUser user = peerreviewUserDao.getUserByUserIDAndSessionID(userId, sessionId); + if ( user != null ) { + eventNotificationService.sendMessage(null, userId.intValue(), IEventNotificationService.DELIVERY_METHOD_MAIL, + getResultsEmailSubject(user.getSession().getPeerreview()), email, true); + return 1; + } else { + log.error("Unable to send Peer Review email as user is not in session. SessionId="+sessionId+" userId="+userId); + return 0; + } + } + + @Override public int emailReportToSessionUsers(Long toolContentId, Long sessionId) { PeerreviewSession session = peerreviewSessionDao.getSessionBySessionId(sessionId); Peerreview peerreview = getPeerreviewByContentId(toolContentId); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/MonitoringAction.java =================================================================== diff -u -reeb8faaea5372ccf5445d7172f726931e9f26098 -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision eeb8faaea5372ccf5445d7172f726931e9f26098) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -48,6 +48,7 @@ import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.rating.model.RatingCriteria; import org.lamsfoundation.lams.tool.peerreview.PeerreviewConstants; +import org.lamsfoundation.lams.tool.peerreview.dto.EmailPreviewDTO; import org.lamsfoundation.lams.tool.peerreview.dto.GroupSummary; import org.lamsfoundation.lams.tool.peerreview.model.Peerreview; import org.lamsfoundation.lams.tool.peerreview.service.IPeerreviewService; @@ -95,9 +96,12 @@ if (param.equals("getReflections")) { return getReflections(mapping, form, request, response); } - if (param.equals("sendResultsToUser")) { - return sendResultsToUser(mapping, form, request, response); + if ( param.equals("previewResultsToUser")) { + return previewResultsToUser(mapping, form, request, response); } + if (param.equals("sendPreviewedResultsToUser")) { + return sendPreviewedResultsToUser(mapping, form, request, response); + } if (param.equals("sendResultsToSessionUsers")) { return sendResultsToSessionUsers(mapping, form, request, response); } @@ -152,6 +156,7 @@ SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + sessionMap.remove("emailPreviewDTO"); // clear any old cached emails Long contentId = (Long) sessionMap.get(PeerreviewConstants.ATTR_TOOL_CONTENT_ID); Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); @@ -217,7 +222,7 @@ JSONArray rows = new JSONArray(); - String emailResultsText = service.getLocalisedMessage("button.email.results", null); + String emailResultsText = service.getLocalisedMessage("button.preview.results", null); if (criteria.isCommentRating()) { // special db lookup just for this - gets the user's & how many comments left for them List rawRows = service.getCommentsCounts(toolContentId, toolSessionId, criteria, page, size, @@ -234,7 +239,7 @@ int numComments = numCommentsNumber != null ? numCommentsNumber.intValue() : 0; if (numComments > 0) { cell.put("rating", service.getLocalisedMessage("label.monitoring.num.of.comments", new Object[] { numComments })); - cell.put("email", generateResultsButton(toolSessionId, rawRow[0], emailResultsText)); + cell.put("email", generatePreviewButton(toolSessionId, rawRow[0], emailResultsText)); } else { cell.put("rating", ""); cell.put("email", ""); @@ -269,10 +274,10 @@ starString += msg; starString += ""; rawRow.put("rating", starString); - rawRow.put("email", generateResultsButton(toolSessionId, (Long) rawRow.get("itemId"), emailResultsText)); + rawRow.put("email", generatePreviewButton(toolSessionId, (Long) rawRow.get("itemId"), emailResultsText)); } else { rawRow.put("rating", averageRating); - rawRow.put("email", generateResultsButton(toolSessionId, (Long) rawRow.get("itemId"), emailResultsText)); + rawRow.put("email", generatePreviewButton(toolSessionId, (Long) rawRow.get("itemId"), emailResultsText)); } } JSONObject row = new JSONObject(); @@ -288,14 +293,14 @@ return null; } - private String generateResultsButton(Object toolSessionId, Object userId, String emailResultsText) { - return new StringBuilder("") + .append(")\" class=\"btn btn-default btn-xs email-button btn-disable-on-submit\">") .append(emailResultsText) - .append("") + .append("") .toString(); } @@ -386,6 +391,7 @@ SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + sessionMap.remove("emailPreviewDTO"); // clear any old cached emails Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); request.setAttribute("toolSessionId", toolSessionId); @@ -400,6 +406,7 @@ SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + sessionMap.remove("emailPreviewDTO"); // clear any old cached emails Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); @@ -481,42 +488,91 @@ return null; } - private ActionForward sendResultsToUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, + private ActionForward previewResultsToUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws JSONException, IOException { - return sendResults(mapping, request, response, true); + + String sessionMapID = request.getParameter(PeerreviewConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + sessionMap.remove("emailPreviewDTO"); // clear any old cached emails + + Long contentId = (Long) sessionMap.get(PeerreviewConstants.ATTR_TOOL_CONTENT_ID); + Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); + + IPeerreviewService service = getPeerreviewService(); + + // only supports single user + Long userId = WebUtil.readLongParam(request, PeerreviewConstants.PARAM_USERID); + String emailHTML = service.generateEmailReportToUser(contentId, toolSessionId, userId); + EmailPreviewDTO dto = new EmailPreviewDTO(emailHTML, toolSessionId, userId); + sessionMap.put("emailPreviewDTO", dto); + return mapping.findForward(PeerreviewConstants.SUCCESS); } + + private ActionForward sendPreviewedResultsToUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException, IOException { + // if we regenerate the results, it is more work for the server and the results may change. if we want to + // just send what the monitor already sees, get it back from the sessionMap, check that it should be the + // same email (ie check the parameters) and if all good then send. + String sessionMapID = request.getParameter(PeerreviewConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + EmailPreviewDTO previewDTO = (EmailPreviewDTO) sessionMap.get("emailPreviewDTO"); + Long contentId = (Long) sessionMap.get(PeerreviewConstants.ATTR_TOOL_CONTENT_ID); + Long dateTimeStamp = WebUtil.readLongParam(request, "dateTimeStamp"); + Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); + Long userId = WebUtil.readLongParam(request, "userID"); + + IPeerreviewService service = getPeerreviewService(); + + if (previewDTO == null || !dateTimeStamp.equals(previewDTO.getDateTimeStamp()) + || !toolSessionId.equals(previewDTO.getToolSessionId()) + || !userId.equals(previewDTO.getLearnerUserId())) { + log.error( + "Unable to send preview as requested parameters to not matched the catched parameters. Email text in session does not match the requested email. Cached preview: " + + previewDTO); + sessionMap.remove("emailPreviewDTO"); // Cached email removed so it can't be resent. + response.setContentType("text/html;charset=utf-8"); + response.getWriter() + .write(service.getLocalisedMessage("label.email.send.failed.preview.wrong", new Object[] {})); + return null; + } + + // Use the details from the DTO, so that if somehow something has got stuff up (and the above check has not picked + // up the issue, make sure you use the user id originally associated with this email. + int numEmailsSent = service.emailReportToUser(contentId, previewDTO.getToolSessionId(), + previewDTO.getLearnerUserId(), previewDTO.getEmailHTML()); + sessionMap.remove("emailPreviewDTO"); // Cached email removed so it can't be resent. + response.setContentType("text/html;charset=utf-8"); + response.getWriter().write(service.getLocalisedMessage("msg.results.sent", new Object[] { numEmailsSent })); + return null; + + } + private ActionForward sendResultsToSessionUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws JSONException, IOException { - return sendResults(mapping, request, response, false); - } - private ActionForward sendResults(ActionMapping mapping, HttpServletRequest request, - HttpServletResponse response, boolean oneUserOnly) throws JSONException, IOException { - String sessionMapID = request.getParameter(PeerreviewConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); request.setAttribute(PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + sessionMap.remove("emailPreviewDTO"); // clear any old cached emails Long contentId = (Long) sessionMap.get(PeerreviewConstants.ATTR_TOOL_CONTENT_ID); Long toolSessionId = WebUtil.readLongParam(request, "toolSessionId"); IPeerreviewService service = getPeerreviewService(); - int numEmailsSent = 0; - - if ( oneUserOnly) { - Long userId = WebUtil.readLongParam(request, PeerreviewConstants.PARAM_USERID); - numEmailsSent = service.emailReportToUser(contentId, toolSessionId, userId); - } else { - numEmailsSent = service.emailReportToSessionUsers(contentId, toolSessionId); - } + int numEmailsSent = service.emailReportToSessionUsers(contentId, toolSessionId); + response.setContentType("text/html;charset=utf-8"); response.getWriter().write(service.getLocalisedMessage("msg.results.sent", new Object[] { numEmailsSent })); return null; } - + /** * Exports Team Report into Excel spreadsheet. * @throws ServletException Index: lams_tool_preview/web/WEB-INF/struts-config.xml =================================================================== diff -u -r6a8cbf03dadd48f4ba4feb43fedffa052a8b177b -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 6a8cbf03dadd48f4ba4feb43fedffa052a8b177b) +++ lams_tool_preview/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -202,10 +202,15 @@ type="org.lamsfoundation.lams.tool.peerreview.web.action.MonitoringAction" parameter="getReflections" > - + parameter="previewResultsToUser" > + + + Index: lams_tool_preview/web/includes/css/learning.scss =================================================================== diff -u -refa51a5d0464d96fada4e5a70f1fb86c2d726717 -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/web/includes/css/learning.scss (.../learning.scss) (revision efa51a5d0464d96fada4e5a70f1fb86c2d726717) +++ lams_tool_preview/web/includes/css/learning.scss (.../learning.scss) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -75,4 +75,5 @@ } .email-button { margin: 2px; + font-size: $font-size-small !important; // force it to be small or the jqgrid setting will override } Index: lams_tool_preview/web/pages/monitoring/criteriapart.jsp =================================================================== diff -u -r8e090b3ddf269cdffececa4bc55a9333da5b0858 -ra33c2947d2259bc919058b977b73a2a5be7bb968 --- lams_tool_preview/web/pages/monitoring/criteriapart.jsp (.../criteriapart.jsp) (revision 8e090b3ddf269cdffececa4bc55a9333da5b0858) +++ lams_tool_preview/web/pages/monitoring/criteriapart.jsp (.../criteriapart.jsp) (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -123,22 +123,62 @@ setTimeout(function(){ window.dispatchEvent(new Event('resize')); }, 300); }); - - function sendResultsForLearner(sessionId, userId) { - var url = ""; + + function closeResultsForLearner() { + $("#emailPreviewArea").html(""); + $("#emailPreviewArea").hide(); + return false; + } + + function clearMessage() { $("#messageArea2").html(""); + return false; + } + + // Prview the email to be sent to the learner + function previewResultsForLearner(sessionId, userId) { + $(".btn-disable-on-submit").prop("disabled", true); + var url = ""; + clearMessage(); $("#messageArea2_Busy").show(); + $("#emailPreviewArea").load( + url, + { + sessionMapID: "${sessionMapID}", + toolContentID: ${sessionMap.toolContentID}, + toolSessionId: sessionId, + userID: userId, + reqID: (new Date()).getTime() + }, + function() { + $("#messageArea2_Busy").hide(); + $("#emailPreviewArea").show(); + $(".btn-disable-on-submit").prop("disabled", false); + } + ); + return false; + } + + // Send the previewed email to the learner + function sendResultsForLearner(sessionId, userId, dateTimeStamp) { + $(".btn-disable-on-submit").prop("disabled", true); + var url = ""; + clearMessage(); + $("#messageArea2_Busy").show(); $("#messageArea2").load( url, { sessionMapID: "${sessionMapID}", toolContentID: ${sessionMap.toolContentID}, toolSessionId: sessionId, + dateTimeStamp: dateTimeStamp, userID: userId, reqID: (new Date()).getTime() }, function() { $("#messageArea2_Busy").hide(); + closeResultsForLearner(); + $(".btn-disable-on-submit").prop("disabled", false); } ); return false; @@ -174,4 +214,6 @@

-
\ No newline at end of file +
+ + \ No newline at end of file Index: lams_tool_preview/web/pages/monitoring/emailpreview.jsp =================================================================== diff -u --- lams_tool_preview/web/pages/monitoring/emailpreview.jsp (revision 0) +++ lams_tool_preview/web/pages/monitoring/emailpreview.jsp (revision a33c2947d2259bc919058b977b73a2a5be7bb968) @@ -0,0 +1,23 @@ + +<%@ include file="/common/taglibs.jsp"%> + + + + + + +
+
+
+
+
+
${emailPreviewDTO.emailHTML}
+
+ + +
+
+
+ +
\ No newline at end of file