Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java =================================================================== diff -u -r8247b17119f9b3d3c9258069313ed2510a5f0650 -r7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 8247b17119f9b3d3c9258069313ed2510a5f0650) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a) @@ -697,14 +697,14 @@ public List getArchivedLessonMarks(Long lessonId, Integer userId) { final String GET_ARCHIVED_LESSON_MARKS = "FROM GradebookUserLessonArchive a WHERE " - + " a.lesson.lessonId = :lessonId AND a.learner.userId = :userId"; + + " a.lesson.lessonId = :lessonId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; return getSession().createQuery(GET_ARCHIVED_LESSON_MARKS).setLong("lessonId", lessonId) .setInteger("userId", userId).list(); } public List getArchivedActivityMarks(Long activityId, Integer userId) { final String GET_ARCHIVED_ACTIVITY_MARKS = "FROM GradebookUserActivityArchive a WHERE " - + " a.activity.activityId = :activityId AND a.learner.userId = :userId"; + + " a.activity.activityId = :activityId AND a.learner.userId = :userId ORDER BY a.archiveDate DESC"; return getSession().createQuery(GET_ARCHIVED_ACTIVITY_MARKS).setLong("activityId", activityId) .setInteger("userId", userId).list(); } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r471b903caa3365758fbdec0a22440b1b0b3f2947 -r7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 471b903caa3365758fbdec0a22440b1b0b3f2947) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a) @@ -211,9 +211,7 @@ List activityArchives = gradebookDAO.getArchivedActivityMarks(activityId, userId); for (GradebookUserLessonArchive lessonArchive : lessonArchives) { Date archiveDate = lessonArchive.getArchiveDate(); - Date adjustedArchiveDate = userTimezone == null ? archiveDate - : DateUtil.convertToTimeZoneFromDefault(userTimezone, archiveDate); - GBActivityArchiveGridRowDTO activityDTO = new GBActivityArchiveGridRowDTO(attemptOrder, adjustedArchiveDate, + GBActivityArchiveGridRowDTO activityDTO = new GBActivityArchiveGridRowDTO(attemptOrder, lessonArchive.getMark()); for (GradebookUserActivityArchive activityArchive : activityArchives) { if (archiveDate.equals(activityArchive.getArchiveDate())) { @@ -382,6 +380,10 @@ gUserDTO.setMark(gradebookUserActivity.getMark()); } + + boolean hasArchivedMarks = gradebookDAO.hasArchivedMarks(lesson.getLessonId(), learner.getUserId()); + gUserDTO.setHasArchivedMarks(hasArchivedMarks); + gradebookUserDTOs.add(gUserDTO); } } @@ -1086,7 +1088,6 @@ public LinkedHashMap exportLessonGradebook(Lesson lesson) { boolean isWeighted = toolService.isWeightedMarks(lesson.getLearningDesign()); - ; LinkedHashMap dataToExport = new LinkedHashMap(); @@ -1306,6 +1307,8 @@ titleRow[4] = new ExcelCell(getMessage("gradebook.columntitle.mark"), true); rowList.add(titleRow); + Map activityIdToName = new HashMap(); + for (ToolActivity activity : activityToUserDTOMap.keySet()) { //find userDto corresponding to the user @@ -1332,6 +1335,7 @@ String activityRowName = (groupName != null && groupId != null) ? activity.getTitle() + " (" + groupName + ")" : activity.getTitle(); + activityIdToName.put(activity.getActivityId(), activityRowName); String startDate = (userDto.getStartDate() == null) ? "" : FileUtil.EXPORT_TO_SPREADSHEET_TITLE_DATE_FORMAT.format(userDto.getStartDate()); @@ -1348,6 +1352,68 @@ } } + // check if learner has restarted the lesson and has archived marks + boolean hasArchivedMarks = gradebookDAO.hasArchivedMarks(lesson.getLessonId(), learner.getUserId()); + if (hasArchivedMarks) { + // "Previous attempts" row + ExcelCell[] attemptsRow = new ExcelCell[1]; + attemptsRow[0] = new ExcelCell(getMessage("gradebook.columntitle.attempts"), true); + rowList.add(attemptsRow); + + List lessonArchives = gradebookDAO + .getArchivedLessonMarks(lesson.getLessonId(), learner.getUserId()); + int attemptOrder = lessonArchives.size(); + // go through each lesson attempt + for (GradebookUserLessonArchive lessonArchive : lessonArchives) { + // lesson attempt header + ExcelCell[] attemptRow = new ExcelCell[4]; + attemptRow[0] = new ExcelCell(getMessage("gradebook.columntitle.attempt"), true); + attemptRow[1] = new ExcelCell(attemptOrder, true); + attemptRow[1].setAlignment(ExcelCell.ALIGN_LEFT); + attemptRow[2] = new ExcelCell(getMessage("gradebook.columntitle.lesson.mark"), true); + attemptRow[3] = new ExcelCell(lessonArchive.getMark(), false); + rowList.add(attemptRow); + + // go throuch each activity and see if there is an archived mark for it + for (ToolActivity activity : activityToUserDTOMap.keySet()) { + ExcelCell[] activityDataRow = null; + List activityArchives = gradebookDAO + .getArchivedActivityMarks(activity.getActivityId(), learner.getUserId()); + Date archiveDate = lessonArchive.getArchiveDate(); + for (GradebookUserActivityArchive activityArchive : activityArchives) { + // if it matches, we found an archived mark for this activity and this attempt + if (archiveDate.equals(activityArchive.getArchiveDate())) { + LearnerProgressArchive learnerProgress = learnerProgressDAO.getLearnerProgressArchive( + lesson.getLessonId(), learner.getUserId(), lessonArchive.getArchiveDate()); + activityDataRow = new ExcelCell[5]; + activityDataRow[0] = new ExcelCell(activityIdToName.get(activity.getActivityId()), + false); + Date startDate = getActivityStartDate(learnerProgress, activity, null); + activityDataRow[1] = new ExcelCell( + startDate == null ? "" + : FileUtil.EXPORT_TO_SPREADSHEET_TITLE_DATE_FORMAT.format(startDate), + false); + Date finishDate = getActivityFinishDate(learnerProgress, activity, null); + activityDataRow[2] = new ExcelCell( + finishDate == null ? "" + : FileUtil.EXPORT_TO_SPREADSHEET_TITLE_DATE_FORMAT.format(finishDate), + false); + activityDataRow[3] = new ExcelCell( + getActivityDuration(learnerProgress, activity) / 1000, false); + activityDataRow[4] = new ExcelCell(activityArchive.getMark(), false); + break; + } + } + if (activityDataRow == null) { + activityDataRow = new ExcelCell[1]; + activityDataRow[0] = new ExcelCell(activityIdToName.get(activity.getActivityId()), false); + } + rowList.add(activityDataRow); + } + attemptOrder--; + } + } + rowList.add(GradebookService.EMPTY_ROW); } Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r294a26345c2dec685d6a5fe5aa37ab9ce1433dab -r7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 294a26345c2dec685d6a5fe5aa37ab9ce1433dab) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 7de1c6fbf11121cbf61e6aceca6b4e063d5ffc7a) @@ -312,8 +312,9 @@ subGrid : hasArchivedMarks, subGridRowExpanded: function(subgrid_id, row_id) { var subgrid_table_id = subgrid_id + "_t", - rowData = jQuery("#" + subgrid_id.substring(0, subgrid_id.lastIndexOf('_'))).getRowData(row_id), - activityID = rowData["id"].split("_")[0]; + nameParts = subgrid_id.split("_"), + activityID = nameParts[3], + userID = nameParts[1]; jQuery("#"+subgrid_id).html("
"); jQuery("#"+subgrid_table_id).jqGrid({ guiStyle: "bootstrap", @@ -328,63 +329,31 @@ pager: false, colNames: [ "", - "", - "", "", "", "", "", "", + "", "" ], colModel: [ - {name:'id', index:'id', sortable:false, editable: false ,width:40, align:"right"}, - {name:'restart',index:'restart', sortable:false, editable: false, width:60,align:"left"}, - {name:'lessonMark', index:'lessonMark', sortable:false, editable: false, width:50, align:"center" }, + {name:'id', index:'id', sortable:false, editable: false ,width:70, align:"right"}, {name:'status', index:'status', sortable:false, editable:false, width:50, align:"center"}, {name:'timeTaken',index:'timeTaken', sortable:false, editable: false, width:80, align:"center"}, {name:'startDate',index:'startDate', sortable:false, editable:false, search:false, width:85, align:"left"}, {name:'finishDate',index:'finishDate', sortable:false, editable:false, search:false, width:85, align:"left"}, {name:'feedback', index:'feedback', sortable:false, editable: false, width:200, hidden:true}, + {name:'lessonMark', index:'lessonMark', sortable:false, editable: false, width:80, align:"center" }, {name:'mark', index:'mark', sortable:false, editable: false, width:50, align:"center" } ], loadError: function(xhr,st,err) { jQuery("#"+subgrid_table_id).clearGridData(); alert(""); - }, - formatCell: function(rowid, cellname,value, iRow, iCol) { - if (cellname == "mark") { - - var rowData = jQuery("#"+subgrid_table_id).getRowData(rowid); - var string = removeHTMLTags(rowData["mark"]); - - - if (string.indexOf("-") != -1) - { - string = " "; - - } else if (string.indexOf("/") != -1) { - splits = string.split("/"); - - if(splits.length == 2) { - tempMark = splits[0]; - string = " "; - } else { - string = " "; - } - } - - return string; - - } - }, - gridComplete: function(){ - toolTip($(".jqgrow"), "jqgridTooltip"); - } + } }); - } + } }).navGrid("#"+subgrid_table_id+"_pager", {edit:false,add:false,del:false,search:false}); // applying refresh button - }, gridComplete: function(){ initializePortraitPopover(''); @@ -466,8 +435,9 @@ "", "", "", - 'portraitId', - 'activityURL' + 'portraitId', + 'activityURL', + 'hasArchivedMarks' ], colModel:[ {name:'id', index:'id', sortable:false, editable:false, hidden:true, search:false, hidedlg:true}, @@ -480,7 +450,8 @@ {name:'feedback',index:'feedback', sortable:false, editable:true, edittype:'textarea', editoptions:{rows:'4',cols:'20'} , search:false, width:200, hidden:true}, {name:'mark',index:'mark', sortable:true, editable:true, editrules:{number:true}, search:false, width:50, align:"center"}, {name:'portraitId', index:'portraitId', width:0, hidden: true}, - {name:'activityURL', index:'activityURL', width:0, hidden: true} + {name:'activityURL', index:'activityURL', width:0, hidden: true}, + {name:'hasArchivedMarks', index:'hasArchivedMarks', width:0, hidden: true} ], loadError: function(xhr,st,err) { jQuery("#"+subgrid_table_id).clearGridData(); @@ -552,7 +523,56 @@ gridComplete: function(){ initializePortraitPopover(''); fixPagerInCenter(subgrid_table_id+"_pager", 1); - } + }, + subGrid : true, + subGridOptions: { + hasSubgrid: function (options) { + return options.data.hasArchivedMarks == 'true'; + } + }, + subGridRowExpanded: function(subgrid_id, row_id) { + var subgrid_table_id = subgrid_id + "_t", + nameParts = subgrid_id.split("_"), + activityID = nameParts[1], + userID = nameParts[3]; + jQuery("#"+subgrid_id).html("
"); + jQuery("#"+subgrid_table_id).jqGrid({ + guiStyle: "bootstrap", + iconSet: 'fontAwesome', + autoencode:false, + datatype: "xml", + url: "/gradebook/gradebook.do?dispatch=getActivityArchiveGridData&lessonID=${lessonDetails.lessonID}&activityID=" + + activityID + "&view=monUserView&userID=" + userID, + height: "100%", + autowidth:true, + cellEdit:false, + pager: false, + colNames: [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + colModel: [ + {name:'id', index:'id', sortable:false, editable: false ,width:70, align:"right"}, + {name:'status', index:'status', sortable:false, editable:false, width:50, align:"center"}, + {name:'timeTaken',index:'timeTaken', sortable:false, editable: false, width:80, align:"center"}, + {name:'startDate',index:'startDate', sortable:false, editable:false, search:false, width:85, align:"left"}, + {name:'finishDate',index:'finishDate', sortable:false, editable:false, search:false, width:85, align:"left"}, + {name:'feedback', index:'feedback', sortable:false, editable: false, width:200, hidden:true}, + {name:'lessonMark', index:'lessonMark', sortable:false, editable: false, width:80, align:"center" }, + {name:'mark', index:'mark', sortable:false, editable: false, width:50, align:"center" } + ], + loadError: function(xhr,st,err) { + jQuery("#"+subgrid_table_id).clearGridData(); + alert(""); + } + }); + } }).navGrid("#"+subgrid_table_id+"_pager", {edit:false,add:false,del:false,search:false}) // applying refresh button jQuery("#"+subgrid_table_id).jqGrid('filterToolbar');