Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210319.sql =================================================================== diff -u -r0c2e20bdef5ea03a9b23625f92f4717500c4f0b7 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210319.sql (.../patch20210319.sql) (revision 0c2e20bdef5ea03a9b23625f92f4717500c4f0b7) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210319.sql (.../patch20210319.sql) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -5,8 +5,20 @@ --LDEV-5155 Add new rating style, rubrics -ALTER TABLE lams_rating_criteria ADD COLUMN rating_criteia_group_id MEDIUMINT UNSIGNED AFTER rating_criteria_type_id; +ALTER TABLE lams_rating_criteria ADD COLUMN rating_criteria_group_id MEDIUMINT UNSIGNED AFTER rating_criteria_type_id; +CREATE TABLE lams_rating_rubrics_columns ( + uid INT UNSIGNED AUTO_INCREMENT, + rating_criteria_group_id MEDIUMINT UNSIGNED, + rating_criteria_id BIGINT, + order_id TINYINT UNSIGNED NOT NULL, + name VARCHAR(2000), + PRIMARY KEY (uid), + UNIQUE KEY UQ_lams_rating_rubrics_columns_1 (rating_criteria_group_id, rating_criteria_id, order_id), + CONSTRAINT FK_lams_rating_rubrics_columns_1 FOREIGN KEY (rating_criteria_id) REFERENCES lams_rating_criteria (rating_criteria_id) + ON DELETE CASCADE ON UPDATE CASCADE +); + -- Put all sql statements above here -- If there were no errors, commit and restore autocommit to on Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCriteriaDAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCriteriaDAO.java (.../IRatingCriteriaDAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCriteriaDAO.java (.../IRatingCriteriaDAO.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -20,14 +20,14 @@ * **************************************************************** */ - package org.lamsfoundation.lams.rating.dao; import java.util.List; +import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.rating.model.RatingCriteria; -public interface IRatingCriteriaDAO { +public interface IRatingCriteriaDAO extends IBaseDAO { void saveOrUpdate(RatingCriteria criteria); @@ -55,4 +55,7 @@ */ int getCommentsMinWordsLimitForToolContent(Long toolContentId); -} + int getNextRatingCriteriaGroupId(); + + List getRubricsColumnHeaders(int groupId); +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCriteriaDAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCriteriaDAO.java (.../RatingCriteriaDAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCriteriaDAO.java (.../RatingCriteriaDAO.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -30,6 +30,7 @@ import org.lamsfoundation.lams.rating.model.LearnerItemRatingCriteria; import org.lamsfoundation.lams.rating.model.LessonRatingCriteria; import org.lamsfoundation.lams.rating.model.RatingCriteria; +import org.lamsfoundation.lams.rating.model.RatingRubricsColumn; import org.lamsfoundation.lams.rating.model.ToolActivityRatingCriteria; import org.lamsfoundation.lams.tool.exception.DataMissingException; @@ -44,6 +45,12 @@ private static final String GET_COMMENTS_MIN_WORDS_LIMIT_FOR_TOOL_CONTENT_ID = "SELECT r.commentsMinWordsLimit FROM " + RatingCriteria.class.getName() + " AS r WHERE r.toolContentId=? AND r.ratingStyle = 0"; + private static final String GET_MAX_RATING_CRITERIA_GROUP_ID = "SELECT MAX(ratingCriteriaGroupId) FROM " + + RatingCriteria.class.getName(); + + private static final String GET_RUBRICS_COLUMN_HEADERS = "SELECT name FROM " + RatingRubricsColumn.class.getName() + + " AS c WHERE ratingCriteriaGroupId = :groupId AND ratingCriteriaId IS NULL ORDER BY orderId"; + @Override public void saveOrUpdate(RatingCriteria criteria) { getSession().saveOrUpdate(criteria); @@ -57,7 +64,7 @@ @Override public List getByToolContentId(Long toolContentId) { - return (List) (doFind(FIND_BY_TOOL_CONTENT_ID, new Object[] { toolContentId })); + return (doFind(FIND_BY_TOOL_CONTENT_ID, new Object[] { toolContentId })); } @Override @@ -66,7 +73,7 @@ return null; } - RatingCriteria criteria = (RatingCriteria) super.find(RatingCriteria.class, ratingCriteriaId); + RatingCriteria criteria = super.find(RatingCriteria.class, ratingCriteriaId); /** * we must return the real activity, not a Hibernate proxy. So relook it up. This should be quick as it should @@ -107,6 +114,17 @@ } @Override + public int getNextRatingCriteriaGroupId() { + Number result = (Number) find(GET_MAX_RATING_CRITERIA_GROUP_ID).get(0); + return result == null ? 1 : result.intValue() + 1; + } + + public List getRubricsColumnHeaders(int groupId) { + return getSession().createQuery(GET_RUBRICS_COLUMN_HEADERS, String.class).setParameter("groupId", groupId) + .getResultList(); + } + + @Override public int getCommentsMinWordsLimitForToolContent(Long toolContentId) { List list = super.find(GET_COMMENTS_MIN_WORDS_LIMIT_FOR_TOOL_CONTENT_ID, new Object[] { toolContentId }); if (list == null || list.size() == 0) { Index: lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingCriteria.java =================================================================== diff -u -r0c2e20bdef5ea03a9b23625f92f4717500c4f0b7 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingCriteria.java (.../RatingCriteria.java) (revision 0c2e20bdef5ea03a9b23625f92f4717500c4f0b7) +++ lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingCriteria.java (.../RatingCriteria.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -25,7 +25,11 @@ import java.io.Serializable; import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; @@ -35,14 +39,21 @@ import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; import javax.persistence.Table; +import javax.persistence.Transient; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.Nullable; +import com.fasterxml.jackson.core.JsonProcessingException; + /** * Base class for all RatingCriterias. If you add another subclass, you must update * RatingCriteriaDAO.getRatingCriteriaByRatingCriteriaId() and add a ACTIVITY_TYPE constant. @@ -151,9 +162,27 @@ @Column(name = "rating_criteria_type_id", insertable = false, updatable = false) private Integer ratingCriteriaTypeId; - @Column(name = "rating_criteia_group_id") + @Column(name = "rating_criteria_group_id") private Integer ratingCriteriaGroupId; // ID shared between all criteria in the same group, for example all rows in the same rubrics criteria + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "rating_criteria_id") + @OrderBy("order_id") + private List rubricsColumns = new LinkedList<>(); + + /** + * This could not be a collection fetched with Hibernate. + * + * "@Formula" did not work as it always used a non-existing RatingCriteria_rubricsColumnHeaders in the query. + * Regular one-to-many with rating_criteria_group_id as join column resulted in shared collection + * exception. + * Also Hibernate ignores insertable=false, so the list is always managed and yields results when orderId + * is missing. + * So this collection is populated by DAO when needed. + */ + @Transient + private List rubricsColumnHeaders = new LinkedList<>(); + @Column(name = "comments_enabled") private boolean commentsEnabled; // comments for RATING_STYLE_COMMENT, RATING_STYLE_STAR justification for RATING_STYLE_HEDGING @@ -272,6 +301,40 @@ this.ratingCriteriaTypeId = ratingCriteriaTypeId; } + public Integer getRatingCriteriaGroupId() { + return ratingCriteriaGroupId; + } + + public void setRatingCriteriaGroupId(Integer ratingCriteriaGroupId) { + this.ratingCriteriaGroupId = ratingCriteriaGroupId; + } + + public List getRubricsColumnHeaders() { + return rubricsColumnHeaders; + } + + public void setRubricsColumnHeaders(List rubricsColumnHeaders) { + this.rubricsColumnHeaders = rubricsColumnHeaders; + } + + public String getRubricsColumnHeadersJSON() throws JsonProcessingException { + return getRubricsColumnHeaders() == null ? null : JsonUtil.toString(getRubricsColumnHeaders()); + } + + public List getRubricsColumns() { + return rubricsColumns; + } + + public void setRubricsColumns(List rubricsColumns) { + this.rubricsColumns = rubricsColumns; + } + + public String getRubricsColumnsJSON() throws JsonProcessingException { + return getRubricsColumns() == null ? null + : JsonUtil.toString(getRubricsColumns().stream() + .collect(Collectors.mapping(RatingRubricsColumn::getName, Collectors.toList()))); + } + public boolean isCommentsEnabled() { return commentsEnabled; } @@ -439,6 +502,10 @@ try { criteria = (RatingCriteria) super.clone(); criteria.setRatingCriteriaId(null); + criteria.setRubricsColumns(new LinkedList<>()); + for (RatingRubricsColumn column : getRubricsColumns()) { + criteria.getRubricsColumns().add(column.clone()); + } } catch (CloneNotSupportedException e) { RatingCriteria.log.error("When clone " + RatingCriteria.class + " failed"); } Index: lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingRubricsColumn.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingRubricsColumn.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/rating/model/RatingRubricsColumn.java (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -0,0 +1,88 @@ +package org.lamsfoundation.lams.rating.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * The actual rating left by a user + */ +@Entity +@Table(name = "lams_rating_rubrics_columns") +public class RatingRubricsColumn implements java.io.Serializable, Cloneable { + + private static final long serialVersionUID = 5230206250617216351L; + + @Id + @Column + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long uid; + + @Column(name = "rating_criteria_group_id") + private Integer ratingCriteriaGroupId; + + @Column(name = "rating_criteria_id") + private Long ratingCriteriaId; + + @Column(name = "order_id") + private Integer orderId; + + @Column + private String name; + + public RatingRubricsColumn() { + } + + public RatingRubricsColumn(Integer orderId, String name) { + this.orderId = orderId; + this.name = name; + } + + @Override + public RatingRubricsColumn clone() { + return new RatingRubricsColumn(this.getOrderId(), this.getName()); + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Integer getRatingCriteriaGroupId() { + return ratingCriteriaGroupId; + } + + public void setRatingCriteriaGroupId(Integer rubricsId) { + this.ratingCriteriaGroupId = rubricsId; + } + + public Long getRatingCriteriaId() { + return ratingCriteriaId; + } + + public void setRatingCriteriaId(Long ratingCriteriaId) { + this.ratingCriteriaId = ratingCriteriaId; + } + + public Integer getOrderId() { + return orderId; + } + + public void setOrderId(Integer displayOrder) { + this.orderId = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String title) { + this.name = title; + } +} \ No newline at end of file Fisheye: Tag 0b25275e793528d944a724b2ccd4d5a87202f11f refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/rating/model/RubricsColumnHeader.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java =================================================================== diff -u -r1307599981af4c3f63c2da571c07e150d4713e8d -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java (.../IRatingService.java) (revision 1307599981af4c3f63c2da571c07e150d4713e8d) +++ lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java (.../IRatingService.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -226,4 +226,7 @@ List getCommentsByCriteriaAndItem(Long ratingCriteriaId, Long toolSessionId, Long itemId); -} + List getRubricsColumnHeaders(int groupId); + + int getNextRatingCriteriaGroupId(); +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java =================================================================== diff -u -r0882976efca43e50447e828dec31b0eb8b6211e5 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java (.../RatingService.java) (revision 0882976efca43e50447e828dec31b0eb8b6211e5) +++ lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java (.../RatingService.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -50,6 +50,7 @@ import org.lamsfoundation.lams.rating.model.Rating; import org.lamsfoundation.lams.rating.model.RatingComment; import org.lamsfoundation.lams.rating.model.RatingCriteria; +import org.lamsfoundation.lams.rating.model.RatingRubricsColumn; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.JsonUtil; @@ -285,7 +286,7 @@ String userRatingStr = userRating == null ? "" : numberFormat.format(userRating.getRating()); criteriaDto.setUserRating(userRatingStr); } - + // check if there is any data returned from DB regarding this item and criteria Object[] itemStatistics = null; for (Object[] itemStatisticsIter : itemsStatistics) { @@ -480,6 +481,7 @@ // } int criteriaMaxOrderId = WebUtil.readIntParam(request, "criteriaMaxOrderId"); + Map groupIdMap = new HashMap<>(); // i is equal to an old orderId for (int i = 1; i <= criteriaMaxOrderId; i++) { @@ -490,6 +492,8 @@ ratingStyle = RatingCriteria.RATING_STYLE_STAR; } + Integer groupId = WebUtil.readIntParam(request, "groupId" + i, true); + Integer maxRating = WebUtil.readIntParam(request, "maxRating" + i, true); if (maxRating == null) { maxRating = RatingCriteria.getDefaultMaxRating(ratingStyle); @@ -524,6 +528,7 @@ ratingCriteria.setOrderId(newCriteriaOrderId); ratingCriteria.setTitle(criteriaTitle); + ratingCriteria.setRatingStyle(ratingStyle); ratingCriteria.setMaxRating(maxRating); ratingCriteria.setCommentsEnabled(commentsEnabled); @@ -538,8 +543,53 @@ ratingCriteria.setMaximumRates(maxRatings); ratingCriteriaDAO.saveOrUpdate(ratingCriteria); - // !!updatedCriterias.add(ratingCriteria); + if (ratingStyle.equals(RatingCriteria.RATING_STYLE_RUBRICS)) { + if (groupId == null) { + log.error("No group ID found for rubrics rating criterion with order ID " + newCriteriaOrderId); + continue; + } + + Integer newGroupId = groupIdMap.get(groupId); + + if (newGroupId == null) { + if (groupId < 1) { + newGroupId = getNextRatingCriteriaGroupId(); + } else { + newGroupId = groupId; + ratingCriteriaDAO.deleteByProperty(RatingRubricsColumn.class, "ratingCriteriaGroupId", + groupId); + } + + for (int columnIndex = 1; columnIndex <= RatingCriteria.RATING_STYLE_RUBRICS_DEFAULT_MAX; columnIndex++) { + String columnHeaderString = WebUtil.readStrParam(request, + "rubrics" + groupId + "column" + columnIndex, true); + if (columnHeaderString != null) { + RatingRubricsColumn columnHeader = new RatingRubricsColumn(columnIndex, + columnHeaderString); + columnHeader.setRatingCriteriaGroupId(newGroupId); + columnHeader.setName(columnHeaderString); + ratingCriteriaDAO.insert(columnHeader); + } + } + + groupIdMap.put(groupId, newGroupId); + } + + ratingCriteria.setRatingCriteriaGroupId(newGroupId); + + 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); + if (columnString != null) { + RatingRubricsColumn column = new RatingRubricsColumn(columnIndex, columnString); + column.setName(columnString); + ratingCriteria.getRubricsColumns().add(column); + } + } + } + // delete } else if (ratingCriteria != null) { ratingCriteriaDAO.deleteRatingCriteria(ratingCriteria.getRatingCriteriaId()); @@ -785,6 +835,16 @@ } @Override + public List getRubricsColumnHeaders(int groupId) { + return ratingCriteriaDAO.getRubricsColumnHeaders(groupId); + } + + @Override + public int getNextRatingCriteriaGroupId() { + return ratingCriteriaDAO.getNextRatingCriteriaGroupId(); + } + + @Override public List getCommentsByCriteriaAndItem(Long ratingCriteriaId, Long toolSessionId, Long itemId) { return ratingCommentDAO.getCommentsByCriteriaAndItem(ratingCriteriaId, toolSessionId, itemId); } Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java =================================================================== diff -u -reb224b1b9cb0c9ec32783ba1a98ecfbdf5ad7b12 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision eb224b1b9cb0c9ec32783ba1a98ecfbdf5ad7b12) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/service/PeerreviewServiceImpl.java (.../PeerreviewServiceImpl.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -40,6 +41,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; +import org.hibernate.Hibernate; import org.lamsfoundation.lams.confidencelevel.ConfidenceLevelDTO; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.events.IEventNotificationService; @@ -53,6 +55,7 @@ import org.lamsfoundation.lams.rating.dto.StyledCriteriaRatingDTO; import org.lamsfoundation.lams.rating.model.LearnerItemRatingCriteria; import org.lamsfoundation.lams.rating.model.RatingCriteria; +import org.lamsfoundation.lams.rating.model.RatingRubricsColumn; import org.lamsfoundation.lams.rating.service.IRatingService; import org.lamsfoundation.lams.rest.RestTags; import org.lamsfoundation.lams.rest.ToolRestManager; @@ -465,6 +468,7 @@ return getLocalisedMessage("event.sent.results.subject", new Object[] { peerreview.getTitle() }); } + @Override public Map getLearnerData(Long toolContentId, Long sessionId) { PeerreviewSession session = peerreviewSessionDao.getSessionBySessionId(sessionId); Peerreview peerreview = getPeerreviewByContentId(toolContentId); @@ -591,6 +595,8 @@ } toolContentObj.setCreatedBy(null); + fillRubricsColumnHeaders(toolContentObj.getRatingCriterias()); + // set PeerreviewToolContentHandler as null to avoid copy file node in repository again. toolContentObj = Peerreview.newInstance(toolContentObj, toolContentId); try { @@ -619,9 +625,29 @@ // reset it to new toolContentId toolContentObj.setContentId(toolContentId); + Map groupIdMap = new HashMap<>(); if (toolContentObj.getRatingCriterias() != null) { for (LearnerItemRatingCriteria criteria : toolContentObj.getRatingCriterias()) { criteria.setToolContentId(toolContentId); + + if (criteria.getRatingStyle().equals(RatingCriteria.RATING_STYLE_RUBRICS)) { + int existingGroupId = criteria.getRatingCriteriaGroupId(); + Integer newGroupId = groupIdMap.get(existingGroupId); + if (newGroupId == null) { + newGroupId = ratingService.getNextRatingCriteriaGroupId(); + groupIdMap.put(existingGroupId, newUserUid); + + for (int columnIndex = 0; columnIndex < criteria.getRubricsColumnHeaders() + .size(); columnIndex++) { + RatingRubricsColumn columnHeader = new RatingRubricsColumn(columnIndex + 1, + criteria.getRubricsColumnHeaders().get(columnIndex)); + columnHeader.setRatingCriteriaGroupId(newGroupId); + peerreviewDao.insert(columnHeader); + } + } + + criteria.setRatingCriteriaGroupId(newGroupId); + } } } @@ -794,9 +820,27 @@ @Override public List getRatingCriterias(Long toolContentId) { - return ratingService.getCriteriasByToolContentId(toolContentId); + List result = ratingService.getCriteriasByToolContentId(toolContentId); + fillRubricsColumnHeaders(result); + for (RatingCriteria ratingCriteria : result) { + Hibernate.initialize(ratingCriteria.getRubricsColumns()); + } + return result; } + private void fillRubricsColumnHeaders(Collection ratingCriterias) { + for (RatingCriteria ratingCriteria : ratingCriterias) { + fillRubricsColumnHeaders(ratingCriteria); + } + } + + private void fillRubricsColumnHeaders(RatingCriteria ratingCriteria) { + if (ratingCriteria.getRatingStyle().equals(RatingCriteria.RATING_STYLE_RUBRICS)) { + ratingCriteria.setRubricsColumnHeaders( + ratingService.getRubricsColumnHeaders(ratingCriteria.getRatingCriteriaGroupId())); + } + } + @Override public void saveRatingCriterias(HttpServletRequest request, Collection oldCriterias, Long toolContentId) { Index: lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/AuthoringController.java =================================================================== diff -u -r0933451e694b19886dd20e2962fc984e997dbf6e -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 0933451e694b19886dd20e2962fc984e997dbf6e) +++ lams_tool_preview/src/java/org/lamsfoundation/lams/tool/peerreview/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -115,7 +115,7 @@ peerreviewForm.setContentFolderID(contentFolderID); // initial Session Map - SessionMap sessionMap = new SessionMap(); + SessionMap sessionMap = new SessionMap<>(); session.setAttribute(sessionMap.getSessionID(), sessionMap); peerreviewForm.setSessionMapID(sessionMap.getSessionID()); Index: lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag =================================================================== diff -u -r8df24b2c5ee2ea9106cfe421943ad62fbfb46df6 -r0b25275e793528d944a724b2ccd4d5a87202f11f --- lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision 8df24b2c5ee2ea9106cfe421943ad62fbfb46df6) +++ lams_tool_preview/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision 0b25275e793528d944a724b2ccd4d5a87202f11f) @@ -164,7 +164,8 @@ addRow('${criteria.orderId}', '${criteria.ratingStyle}', '${escapedTitle}', '${criteria.maxRating}', - ${criteria.commentsEnabled}, '${criteria.commentsMinWordsLimit}', '${criteria.minimumRates}', '${criteria.maximumRates}', '${criteria.ratingCriteriaGroupId}' ); + ${criteria.commentsEnabled}, '${criteria.commentsMinWordsLimit}', '${criteria.minimumRates}', '${criteria.maximumRates}', + '${criteria.ratingCriteriaGroupId}', '${criteria.rubricsColumnsJSON}', '${criteria.rubricsColumnHeadersJSON}'); maxOrderId = ${maxOrderId}; if ( maxOrderId == 0 ) { @@ -307,7 +308,8 @@ }); } - function addRow(orderId, style, title, maxRating, justifyOrComment, commentMinWordsLimit, minimumRates, maximumRates, groupId) { + function addRow(orderId, style, title, maxRating, justifyOrComment, commentMinWordsLimit, minimumRates, maximumRates, + groupId, rubricsColumnsString, rubricsColumnHeadersString) { var row = jQuery(''); var inputField = ''; var hiddenInputs = '' @@ -378,11 +380,11 @@ if (rubricsTable.length == 0 || rubricsTable.attr('groupId') != groupId) { // this is the first row of a rubrics table, so need to create the table and buttons etc. - rubricsTable = addRubricsTable(groupId); + rubricsTable = addRubricsTable(groupId, rubricsColumnHeadersString ? JSON.parse(rubricsColumnHeadersString) : []); } // input field for rubrics is a textarea, not regular text input - inputField = ''; + inputField = ''; // this criterion is grouped, so we need to store which group it belongs to hiddenInputs += ''; @@ -391,10 +393,13 @@ $('').addClass('rubrics-row-title').append(inputField + hiddenInputs).appendTo(row); // build row structure: row header, value for each column and cell with buttons - var rubricsColumns = $('.rubrics-column', rubricsTable).length; - for (var i = 1; i <= rubricsColumns; i++) { + var rubricsColumns = rubricsColumnsString ? JSON.parse(rubricsColumnsString) : []; + var rubricsColumnsLength = $('.rubrics-column', rubricsTable).length; + for (var i = 0; i < rubricsColumnsLength; i++) { var cell = $('').appendTo(row); - $('