Index: lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java =================================================================== diff -u -r0b25275e793528d944a724b2ccd4d5a87202f11f -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java (.../RatingService.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) +++ lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java (.../RatingService.java) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -527,7 +527,7 @@ } ratingCriteria.setOrderId(newCriteriaOrderId); - ratingCriteria.setTitle(criteriaTitle); + ratingCriteria.setTitle(criteriaTitle.strip().replaceAll("\r\n", "
")); ratingCriteria.setRatingStyle(ratingStyle); ratingCriteria.setMaxRating(maxRating); @@ -568,7 +568,7 @@ RatingRubricsColumn columnHeader = new RatingRubricsColumn(columnIndex, columnHeaderString); columnHeader.setRatingCriteriaGroupId(newGroupId); - columnHeader.setName(columnHeaderString); + columnHeader.setName(columnHeaderString.strip().replaceAll("\r\n", "
")); ratingCriteriaDAO.insert(columnHeader); } } @@ -580,11 +580,10 @@ ratingCriteria.getRubricsColumns().clear(); for (int columnIndex = 1; columnIndex <= RatingCriteria.RATING_STYLE_RUBRICS_DEFAULT_MAX; columnIndex++) { - String columnString = WebUtil.readStrParam(request, - "rubrics" + newCriteriaOrderId + "cell" + columnIndex, true); + String columnString = WebUtil.readStrParam(request, "rubrics" + i + "cell" + columnIndex, true); if (columnString != null) { RatingRubricsColumn column = new RatingRubricsColumn(columnIndex, columnString); - column.setName(columnString); + column.setName(columnString.strip().replaceAll("\r\n", "
")); ratingCriteria.getRubricsColumns().add(column); } } Index: lams_tool_preview/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r152642ba22a463e187e33abefc6b82258e249cf8 -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 152642ba22a463e187e33abefc6b82258e249cf8) +++ lams_tool_preview/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -101,6 +101,7 @@ label.rating.rubrics.column.add = Add column label.rating.rubrics.row.headers = Row headers label.rating.rubrics.row.add = Add row +label.rating.rubrics.error.rate = Error while saving your answer. error.rating.hedge.total.add.up = Marks for criteria {0} must add up to {1} error.rating.rank.all = You must rank all the learners for criteria {0} label.justify.hedging.marks = Justify your mark allocation. Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java =================================================================== diff -u -reb224b1b9cb0c9ec32783ba1a98ecfbdf5ad7b12 -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision eb224b1b9cb0c9ec32783ba1a98ecfbdf5ad7b12) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/IPeerreviewService.java (.../IPeerreviewService.java) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -228,6 +228,8 @@ List getCriteriasByToolContentId(Long toolContentId); + void fillRubricsColumnHeaders(RatingCriteria ratingCriteria); + /** Save the ratings for ranking and hedging. */ int rateItems(RatingCriteria ratingCriteria, Long toolSessionId, Integer userId, Map newRatings); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java =================================================================== diff -u -r0b25275e793528d944a724b2ccd4d5a87202f11f -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -834,7 +834,8 @@ } } - private void fillRubricsColumnHeaders(RatingCriteria ratingCriteria) { + @Override + public void fillRubricsColumnHeaders(RatingCriteria ratingCriteria) { if (ratingCriteria.getRatingStyle().equals(RatingCriteria.RATING_STYLE_RUBRICS)) { ratingCriteria.setRubricsColumnHeaders( ratingService.getRubricsColumnHeaders(ratingCriteria.getRatingCriteriaGroupId())); Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/LearningController.java =================================================================== diff -u -r3ee06bc1b00b1673399c1871a73cfa1d8ec2c0db -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/LearningController.java (.../LearningController.java) (revision 3ee06bc1b00b1673399c1871a73cfa1d8ec2c0db) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/LearningController.java (.../LearningController.java) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -27,8 +27,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -97,7 +101,7 @@ public String start(HttpServletRequest request, HttpSession session) throws IOException, ServletException { // initial Session Map - SessionMap sessionMap = new SessionMap(); + SessionMap sessionMap = new SessionMap<>(); session.setAttribute(sessionMap.getSessionID(), sessionMap); // save toolContentID into HTTPSession @@ -265,10 +269,25 @@ } RatingCriteria newCriteria = null; + List criterias = null; if (!user.isSessionFinished()) { // mark user as finished if there are not any criterias or we have processed the last one. - List criterias = service.getCriteriasByToolContentId(peerreview.getContentId()); + criterias = service.getCriteriasByToolContentId(peerreview.getContentId()); + // for criteria groups, like rubrics, count only first criterion + Set processedCriteriaGroups = new HashSet<>(); + Iterator criteriaIter = criterias.iterator(); + while (criteriaIter.hasNext()) { + RatingCriteria criterion = criteriaIter.next(); + if (criterion.getRatingCriteriaGroupId() != null) { + if (processedCriteriaGroups.contains(criterion.getRatingCriteriaGroupId())) { + criteriaIter.remove(); + } else { + processedCriteriaGroups.add(criterion.getRatingCriteriaGroupId()); + } + } + } + if (criterias.size() > 0) { if (currentCriteria == null) { // get the first one @@ -329,11 +348,13 @@ if (peerreview.isShowRatingsLeftForUser() || peerreview.isShowRatingsLeftByUser() || entryText.length() > 0) { String redirectURL = SHOW_RESULTS_REDIRECT; - redirectURL = WebUtil.appendParameterToURL(redirectURL, PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + redirectURL = WebUtil.appendParameterToURL(redirectURL, PeerreviewConstants.ATTR_SESSION_MAP_ID, + sessionMap.getSessionID()); return redirectURL; } else if (peerreview.isReflectOnActivity()) { String redirectURL = NEW_REFLECTION_REDIRECT; - redirectURL = WebUtil.appendParameterToURL(redirectURL, PeerreviewConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + redirectURL = WebUtil.appendParameterToURL(redirectURL, PeerreviewConstants.ATTR_SESSION_MAP_ID, + sessionMap.getSessionID()); return redirectURL; } else { // finish @@ -371,10 +392,10 @@ // ratings left by and by the user List ratingCriterias = service.getRatingCriterias(peerreview.getContentId()); List allUsersDtos = peerreview.isShowRatingsLeftByUser() - ? new ArrayList(ratingCriterias.size()) + ? new ArrayList<>(ratingCriterias.size()) : null; List currentUserDtos = peerreview.isShowRatingsLeftForUser() - ? new ArrayList(ratingCriterias.size()) + ? new ArrayList<>(ratingCriterias.size()) : null; for (RatingCriteria criteria : ratingCriterias) { @@ -509,33 +530,56 @@ } Long userId = (mode != null && mode.isTeacher()) ? -1 : user.getUserId(); + StyledCriteriaRatingDTO criteriaDto = null; - StyledCriteriaRatingDTO dto = service.getUsersRatingsCommentsByCriteriaIdDTO(toolContentId, toolSessionId, - criteria, userId, (criteria.isCommentRating() || criteria.isStarStyleRating()), - PeerreviewConstants.SORT_BY_USERNAME_ASC, null, peerreview.isSelfReview(), true); + if (criteria.isRubricsStyleRating()) { + List criterias = service.getRatingCriterias(peerreview.getContentId()); - // Send the number of users to rate in rateAll, or send 0. Do not want to modify the criteria min/max as it is originally - // a Hibernate object and don't want to risk updating it in the db. Need to send a flag so why not make flag double as the - // runtime min/max value while leaving min/max as the original criteria definition. - int rateAllUsers = 0; - if ((criteria.isRankingStyleRating() && criteria.getMaxRating() == RatingCriteria.RATING_RANK_ALL) - || (criteria.isStarStyleRating() && criteria.getMinimumRates() == RatingCriteria.RATING_RANK_ALL) - || (criteria.isCommentRating() && criteria.getMinimumRates() == RatingCriteria.RATING_RANK_ALL)) { - rateAllUsers = service.getCountUsersBySession(toolSessionId, peerreview.isSelfReview() ? -1 : userId); - } else if ((criteria.isStarStyleRating() || criteria.isCommentRating()) - && (peerreview.getMinimumRates() > 0 || peerreview.getMaximumRates() > 0) - && (dto.getRatingCriteria().getMinimumRates() == 0 && dto.getRatingCriteria().getMaximumRates() == 0)) { - // override the min/max for stars based on old settings if needed (original Peer Review kept one setting for all criteria ) - // does not matter if this change gets persisted to database. - criteria.setMinimumRates(peerreview.getMinimumRates()); - criteria.setMaximumRates(peerreview.getMaximumRates()); + Integer groupId = criteria.getRatingCriteriaGroupId(); + List dtos = new LinkedList<>(); + for (RatingCriteria criteriaInGroup : criterias) { + if (!groupId.equals(criteriaInGroup.getRatingCriteriaGroupId())) { + continue; + } + StyledCriteriaRatingDTO dto = service.getUsersRatingsCommentsByCriteriaIdDTO(toolContentId, + toolSessionId, criteriaInGroup, userId, false, PeerreviewConstants.SORT_BY_USERNAME_ASC, null, + peerreview.isSelfReview(), true); + if (criteriaDto == null) { + criteriaDto = dto; + } + dtos.add(dto); + } + request.setAttribute("criteriaGroup", dtos); + } else { + criteriaDto = service.getUsersRatingsCommentsByCriteriaIdDTO(toolContentId, toolSessionId, criteria, userId, + (criteria.isCommentRating() || criteria.isStarStyleRating()), + PeerreviewConstants.SORT_BY_USERNAME_ASC, null, peerreview.isSelfReview(), true); + + // Send the number of users to rate in rateAll, or send 0. Do not want to modify the criteria min/max as it is originally + // a Hibernate object and don't want to risk updating it in the db. Need to send a flag so why not make flag double as the + // runtime min/max value while leaving min/max as the original criteria definition. + int rateAllUsers = 0; + if ((criteria.isRankingStyleRating() && criteria.getMaxRating() == RatingCriteria.RATING_RANK_ALL) + || (criteria.isStarStyleRating() && criteria.getMinimumRates() == RatingCriteria.RATING_RANK_ALL) + || (criteria.isCommentRating() && criteria.getMinimumRates() == RatingCriteria.RATING_RANK_ALL)) { + rateAllUsers = service.getCountUsersBySession(toolSessionId, peerreview.isSelfReview() ? -1 : userId); + } else if ((criteria.isStarStyleRating() || criteria.isCommentRating()) + && (peerreview.getMinimumRates() > 0 || peerreview.getMaximumRates() > 0) + && (criteriaDto.getRatingCriteria().getMinimumRates() == 0 + && criteriaDto.getRatingCriteria().getMaximumRates() == 0)) { + // override the min/max for stars based on old settings if needed (original Peer Review kept one setting for all criteria ) + // does not matter if this change gets persisted to database. + criteria.setMinimumRates(peerreview.getMinimumRates()); + criteria.setMaximumRates(peerreview.getMaximumRates()); + } + + int countRatedUsers = service.getCountItemsRatedByUserByCriteria(criteria.getRatingCriteriaId(), + user.getUserId().intValue()); + request.setAttribute(AttributeNames.ATTR_COUNT_RATED_ITEMS, countRatedUsers); + request.setAttribute("rateAllUsers", rateAllUsers); } + request.setAttribute("criteriaRatings", criteriaDto); - int countRatedUsers = service.getCountItemsRatedByUserByCriteria(criteria.getRatingCriteriaId(), - user.getUserId().intValue()); - request.setAttribute(AttributeNames.ATTR_COUNT_RATED_ITEMS, countRatedUsers); - request.setAttribute("rateAllUsers", rateAllUsers); - request.setAttribute("criteriaRatings", dto); return LEARNING_SUCCESS_PATH; } @@ -703,7 +747,7 @@ if (!(peerreview.getLockWhenFinished() && user.isSessionFinished())) { Integer userId = user.getUserId().intValue(); - Map ratings = new HashMap(); + Map ratings = new HashMap<>(); boolean valid = false; if (criteria.isHedgeStyleRating()) { Index: lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag =================================================================== diff -u -rff38bce0413c4a4a3d0793a071390d12c5912a00 -rec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d --- lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision ff38bce0413c4a4a3d0793a071390d12c5912a00) +++ lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision ec21ca839bfcba1bb6d6b45276c39a0cc3cb2f3d) @@ -163,7 +163,7 @@ - addRow('${criteria.orderId}', '${criteria.ratingStyle}', '${escapedTitle}', '${criteria.maxRating}', + addRow('${criteria.orderId}', '${criteria.ratingStyle}', '${escapedTitle}'.replaceAll('<BR/>', '\r\n'), '${criteria.maxRating}', ${criteria.commentsEnabled}, '${criteria.commentsMinWordsLimit}', '${criteria.minimumRates}', '${criteria.maximumRates}', '${criteria.ratingCriteriaGroupId}', '${criteria.rubricsColumnsJSON}', '${criteria.rubricsColumnHeadersJSON}'); @@ -398,7 +398,7 @@ for (var i = 0; i < rubricsColumnsLength; i++) { var cell = $('').appendTo(row); $('