Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java =================================================================== diff -u -r8d982bb83bb4040e0eba0076df8ab05ff715f2e9 -r7fdda695e029753cdb6cbd771cf897080afc942c --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java (.../ScratchieAnswerVisitDAO.java) (revision 8d982bb83bb4040e0eba0076df8ab05ff715f2e9) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java (.../ScratchieAnswerVisitDAO.java) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) @@ -46,5 +46,10 @@ List getLogsBySessionAndItem(Long sessionId, Long itemUid); List getLogsBySession(Long sessionId); - + + /** + * @param scratchieUid + * @return all visit logs left for the activity with specified scratchieUid + */ + List getLogsByScratchieUid(Long scratchieUid); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java =================================================================== diff -u -r8d982bb83bb4040e0eba0076df8ab05ff715f2e9 -r7fdda695e029753cdb6cbd771cf897080afc942c --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java (.../ScratchieAnswerVisitDAOHibernate.java) (revision 8d982bb83bb4040e0eba0076df8ab05ff715f2e9) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java (.../ScratchieAnswerVisitDAOHibernate.java) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) @@ -29,16 +29,11 @@ import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.tool.scratchie.dao.ScratchieAnswerVisitDAO; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; +import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.springframework.stereotype.Repository; @Repository public class ScratchieAnswerVisitDAOHibernate extends LAMSBaseDAO implements ScratchieAnswerVisitDAO { - private static final String FIND_BY_SESSION_AND_ITEM = "FROM " + ScratchieAnswerVisitLog.class.getName() - + " AS r WHERE r.sessionId=? AND r.qbToolQuestion.uid = ? ORDER BY r.accessDate ASC"; - - private static final String FIND_BY_SESSION = "FROM " + ScratchieAnswerVisitLog.class.getName() - + " AS r WHERE r.sessionId=? ORDER BY r.accessDate ASC"; - private static final String FIND_COUNT_BY_SESSION = "SELECT COUNT(*) FROM " + ScratchieAnswerVisitLog.class.getName() + " AS r WHERE r.sessionId=?"; @@ -88,16 +83,37 @@ return ((Number) list.get(0)).intValue(); } - @SuppressWarnings("unchecked") @Override public List getLogsBySessionAndItem(Long sessionId, Long itemUid) { - return (List) doFind(FIND_BY_SESSION_AND_ITEM, new Object[] { sessionId, itemUid }); + final String FIND_BY_SESSION_AND_ITEM = "FROM " + ScratchieAnswerVisitLog.class.getName() + + " AS r WHERE r.sessionId=:sessionId AND r.qbToolQuestion.uid =:itemUid ORDER BY r.accessDate ASC"; + + Query query = getSession().createQuery(FIND_BY_SESSION_AND_ITEM, + ScratchieAnswerVisitLog.class); + query.setParameter("sessionId", sessionId); + query.setParameter("itemUid", itemUid); + return query.list(); } - @SuppressWarnings("unchecked") @Override public List getLogsBySession(Long sessionId) { - return (List) doFind(FIND_BY_SESSION, new Object[] { sessionId }); + final String FIND_BY_SESSION = "FROM " + ScratchieAnswerVisitLog.class.getName() + + " AS r WHERE r.sessionId=:sessionId ORDER BY r.accessDate ASC"; + + Query query = getSession().createQuery(FIND_BY_SESSION, ScratchieAnswerVisitLog.class); + query.setParameter("sessionId", sessionId); + return query.list(); } + + @Override + public List getLogsByScratchieUid(Long scratchieUid) { + final String FIND_BY_SCRATCHIE_UID = "SELECT log FROM " + ScratchieAnswerVisitLog.class.getName() + " AS log, " + + ScratchieSession.class.getName() + " AS session " + + " WHERE log.sessionId = session.sessionId AND session.scratchie.uid=:scratchieUid ORDER BY log.accessDate ASC"; + Query query = getSession().createQuery(FIND_BY_SCRATCHIE_UID, ScratchieAnswerVisitLog.class); + query.setParameter("scratchieUid", scratchieUid); + return query.list(); + } + } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r9091ed8c9bae9a48f88622c0c5031af2a39772dc -r7fdda695e029753cdb6cbd771cf897080afc942c --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 9091ed8c9bae9a48f88622c0c5031af2a39772dc) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) @@ -1329,6 +1329,8 @@ items.addAll(scratchie.getScratchieItems()); int numberOfItems = items.size(); + List logs = scratchieAnswerVisitDao.getLogsByScratchieUid(scratchie.getUid()); + List sheets = new LinkedList<>(); // ======================================================= For Immediate Analysis page @@ -1586,11 +1588,11 @@ GroupSummary allTeamSummary = itemSummary.get(0); Collection optionDtos = allTeamSummary.getOptionDtos(); - + row = researchAndAnalysisSheet.initRow(); row.addEmptyCell(); for (int i = 0; i < optionDtos.size(); i++) { - row.addCell((long) i + 1, IndexedColors.YELLOW); + row.addCell(Long.valueOf(i + 1), IndexedColors.YELLOW); } for (OptionDTO optionDto : optionDtos) { @@ -1624,17 +1626,28 @@ row = researchAndAnalysisSheet.initRow(); row.addCell(groupSummary.getSessionName(), true); + + int longestRowLength = 0; + if (isMcqItem) { + longestRowLength = optionDtos.size(); + } else { + for (OptionDTO optionDto : optionDtos) { + if (longestRowLength < optionDto.getAttempts().length) { + longestRowLength = optionDto.getAttempts().length; + } + } + } row = researchAndAnalysisSheet.initRow(); row.addEmptyCell(); - for (int i = 0; i < optionDtos.size(); i++) { + for (int i = 0; i < longestRowLength; i++) { row.addCell(Integer.valueOf(i + 1)); } for (OptionDTO optionDto : optionDtos) { - row = researchAndAnalysisSheet.initRow(); - String optionTitle = removeHtmlMarkup(optionDto.getAnswer()); + String optionTitle = isMcqItem ? removeHtmlMarkup(optionDto.getAnswer()) + : optionDto.getAnswer().strip().replace("\r\n", ", "); if (optionDto.isCorrect()) { optionTitle += "(" + getMessage("label.monitoring.item.summary.correct") + ")"; } @@ -1658,12 +1671,10 @@ List sessionList = scratchieSessionDao.getByContentId(scratchie.getContentId()); for (ScratchieSession session : sessionList) { - ScratchieUser groupLeader = session.getGroupLeader(); Long sessionId = session.getSessionId(); if (groupLeader != null) { - row = researchAndAnalysisSheet.initRow(); row.addCell(groupLeader.getFirstName() + " " + groupLeader.getLastName(), true); row.addCell(getMessage("label.attempts") + ":"); @@ -1676,21 +1687,27 @@ row.addCell(getMessage("label.team.leader") + session.getSessionName()); for (ScratchieItem item : items) { + boolean isMcqItem = item.getQbQuestion().getType() == QbQuestion.TYPE_MULTIPLE_CHOICE; + + //build list of all logs left for this item and this session + List logsBySessionAndItem = new ArrayList<>(); + for (ScratchieAnswerVisitLog log : logs) { + if (log.getSessionId().equals(sessionId) && log.getQbToolQuestion().getUid().equals(item.getUid())) { + logsBySessionAndItem.add(log); + } + } + row = researchAndAnalysisSheet.initRow(); row.addCell(getMessage("label.question.semicolon", new Object[] { item.getQbQuestion().getName() }), false); int i = 1; - boolean isMcqItem = item.getQbQuestion().getType() == QbQuestion.TYPE_MULTIPLE_CHOICE; - List logs = scratchieAnswerVisitDao.getLogsBySessionAndItem(sessionId, - item.getUid()); - for (ScratchieAnswerVisitLog log : logs) { + for (ScratchieAnswerVisitLog log : logsBySessionAndItem) { row = researchAndAnalysisSheet.initRow(); row.addCell(Integer.valueOf(i++)); String answerDescr = isMcqItem ? log.getQbOption().getName() : log.getAnswer(); row.addCell(removeHtmlMarkup(answerDescr)); row.addCell(fullDateFormat.format(log.getAccessDate())); - } researchAndAnalysisSheet.addEmptyRow(); } @@ -1705,11 +1722,29 @@ // Table header------------------------------------ - int maxOptions = 0; + int maxLogCount = 0; for (ScratchieItem item : items) { - if (item.getOptionDtos().size() > maxOptions) { - maxOptions = item.getOptionDtos().size(); + //search for max value in options size + if (item.getOptionDtos().size() > maxLogCount) { + maxLogCount = item.getOptionDtos().size(); } + + //search for max value in logs length + for (GroupSummary summary : summaryByTeam) { + Long sessionId = summary.getSessionId(); + + int logsBySessionAndItem = 0; + for (ScratchieAnswerVisitLog log : logs) { + if (log.getSessionId().equals(sessionId) + && log.getQbToolQuestion().getUid().equals(item.getUid())) { + logsBySessionAndItem++; + } + } + + if (logsBySessionAndItem > maxLogCount) { + maxLogCount = logsBySessionAndItem; + } + } } row = spssAnalysisSheet.initRow(); @@ -1723,11 +1758,11 @@ row.addCell(getMessage("label.number.of.attempts"), true); row.addCell(getMessage("label.mark.awarded"), true); - for (int i = 0; i < maxOptions; i++) { + for (int i = 0; i < maxLogCount; i++) { row.addCell(getMessage("label." + (i + 1) + ".answer.selected"), true); } row.addCell(getMessage("label.date"), true); - for (int i = 0; i < maxOptions; i++) { + for (int i = 0; i < maxLogCount; i++) { row.addCell(getMessage("label.time.of.selection." + (i + 1)), true); } @@ -1740,6 +1775,7 @@ for (ScratchieUser user : users) { int questionCount = 1; for (ScratchieItemDTO itemDto : summary.getItemDtos()) { + boolean isMcqItem = itemDto.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE; row = spssAnalysisSheet.initRow(); // learner name @@ -1759,7 +1795,8 @@ for (OptionDTO option : options) { if (option.isCorrect()) { correctOption = option.getAnswer(); - correctOption = removeHtmlMarkup(correctOption); + correctOption = isMcqItem ? removeHtmlMarkup(correctOption) + : correctOption.strip().replace("\r\n", ", "); } } row.addCell(correctOption); @@ -1781,42 +1818,39 @@ Object mark = (itemDto.getUserMark() == -1) ? "" : Long.valueOf(itemDto.getUserMark()); row.addCell(mark); - // options selected - List logs = scratchieAnswerVisitDao.getLogsBySessionAndItem(sessionId, - itemDto.getUid()); - if (logs == null) { - logs = new ArrayList<>(); + //build list of all logs left for this item and this session + List logsBySessionAndItem = new ArrayList<>(); + for (ScratchieAnswerVisitLog log : logs) { + if (log.getSessionId().equals(sessionId) && log.getQbToolQuestion().getUid().equals(itemDto.getUid())) { + logsBySessionAndItem.add(log); + } } - boolean isMcqItem = itemDto.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE; - for (ScratchieAnswerVisitLog log : logs) { + for (ScratchieAnswerVisitLog log : logsBySessionAndItem) { String answer = removeHtmlMarkup(isMcqItem ? log.getQbOption().getName() : log.getAnswer()); row.addCell(answer); } - for (int i = logs.size(); i < itemDto.getOptionDtos().size(); i++) { - row.addCell(getMessage("label.none")); + for (int i = logsBySessionAndItem.size(); i < maxLogCount; i++) { + row.addEmptyCell(); } - for (int i = options.size(); i < maxOptions; i++) { - row.addCell(""); - } // Date String dateStr = ""; - if (logs.size() > 0) { + if (logsBySessionAndItem.size() > 0) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"); - Date accessDate = logs.iterator().next().getAccessDate(); + Date accessDate = logsBySessionAndItem.iterator().next().getAccessDate(); dateStr = dateFormat.format(accessDate); } row.addCell(dateStr); // time of selection SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); - for (ScratchieAnswerVisitLog log : logs) { + for (ScratchieAnswerVisitLog log : logsBySessionAndItem) { Date accessDate = log.getAccessDate(); String timeStr = timeFormat.format(accessDate); row.addCell(timeStr); } - for (int i = logs.size(); i < maxOptions; i++) { + for (int i = logsBySessionAndItem.size(); i < maxLogCount; i++) { row.addCell(""); } } @@ -1980,7 +2014,17 @@ itemDto.setUid(item.getUid()); itemDto.setTitle(qbQuestion.getName()); itemDto.setType(qbQuestion.getType()); - itemDto.setOptionDtos(item.getOptionDtos()); + List optionDtos = new LinkedList<>(); + if (isMcqItem) { + optionDtos = item.getOptionDtos(); + } else { + for (QbOption qbOption : qbQuestion.getQbOptions()) { + OptionDTO optionDTO = new OptionDTO(qbOption); + optionDTO.setMcqType(false); + optionDtos.add(optionDTO); + } + } + itemDto.setOptionDtos(optionDtos); itemDto.setUserAttempts(numberOfAttempts); itemDto.setUserMark(mark); itemDto.setUnraveledOnFirstAttempt(isUnraveledOnFirstAttempt); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java =================================================================== diff -u -re6dc4db4137cfd6b07a4aa79711b9d12b39fb78e -r7fdda695e029753cdb6cbd771cf897080afc942c --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java (.../TblMonitorController.java) (revision e6dc4db4137cfd6b07a4aa79711b9d12b39fb78e) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/TblMonitorController.java (.../TblMonitorController.java) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) @@ -169,7 +169,7 @@ } summary.setMark(numberOfFirstChoiceEvents); Double percentage = (items.size() == 0) ? 0 : (double) numberOfFirstChoiceEvents * 100 / items.size(); - summary.setTotalPercentage(percentage + "%"); + summary.setTotalPercentage(percentage.toString()); } request.setAttribute("sessionDtos", groupSummaries); Index: lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp =================================================================== diff -u -re6dc4db4137cfd6b07a4aa79711b9d12b39fb78e -r7fdda695e029753cdb6cbd771cf897080afc942c --- lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp (.../traStudentChoices.jsp) (revision e6dc4db4137cfd6b07a4aa79711b9d12b39fb78e) +++ lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp (.../traStudentChoices.jsp) (revision 7fdda695e029753cdb6cbd771cf897080afc942c) @@ -160,7 +160,7 @@ - ${sessionDto.totalPercentage} + %