+
+
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java
===================================================================
diff -u -r193e1ddf0d23bb2d90636908378b8dbe4a089dbc -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 193e1ddf0d23bb2d90636908378b8dbe4a089dbc)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -228,9 +228,10 @@
//flux management
public static final String COMPLETION_CHARTS_UPDATE_SINK_NAME = "assessment completion chart updated";
-
public static final String ANSWERS_UPDATED_SINK_NAME = "assessment learner answers updated";
public static final String LEARNER_TRAVERSED_SINK_NAME = "assessment learner traversed";
-
public static final String COMPLETION_CHARTS_UPDATE_FLUX_NAME = "assessment completion chart updated";
+
+ public static final String TIME_LIMIT_PANEL_UPDATE_SINK_NAME = "assessment time limit panel updated";
+ public static final String TIME_LIMIT_PANEL_UPDATE_FLUX_NAME = "assessment time limit panel updated";
}
\ No newline at end of file
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -500,7 +500,7 @@
return absoluteTimeLimitFinish;
}
- public Long getAbsoluteTimeLimitSeconds() {
+ public Long getAbsoluteTimeLimitFinishSeconds() {
return absoluteTimeLimitFinish == null
? null
: absoluteTimeLimitFinish.atZone(ZoneId.systemDefault()).toEpochSecond();
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -102,15 +102,7 @@
import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO;
import org.lamsfoundation.lams.tool.assessment.dao.AssessmentSessionDAO;
import org.lamsfoundation.lams.tool.assessment.dao.AssessmentUserDAO;
-import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.GradeStatsDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.OptionDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.QuestionDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary;
-import org.lamsfoundation.lams.tool.assessment.dto.ReflectDTO;
-import org.lamsfoundation.lams.tool.assessment.dto.UserSummary;
-import org.lamsfoundation.lams.tool.assessment.dto.UserSummaryItem;
+import org.lamsfoundation.lams.tool.assessment.dto.*;
import org.lamsfoundation.lams.tool.assessment.model.Assessment;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentOptionAnswer;
import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion;
@@ -134,14 +126,11 @@
import org.lamsfoundation.lams.usermanagement.User;
import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
-import org.lamsfoundation.lams.util.FileUtil;
-import org.lamsfoundation.lams.util.JsonUtil;
-import org.lamsfoundation.lams.util.MessageService;
-import org.lamsfoundation.lams.util.NumberUtil;
-import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.util.*;
import org.lamsfoundation.lams.util.excel.ExcelCell;
import org.lamsfoundation.lams.util.excel.ExcelRow;
import org.lamsfoundation.lams.util.excel.ExcelSheet;
+import org.lamsfoundation.lams.util.hibernate.HibernateSessionManager;
import org.springframework.web.util.UriUtils;
import com.fasterxml.jackson.databind.JsonNode;
@@ -213,6 +202,19 @@
AssessmentConstants.COMPLETION_CHARTS_UPDATE_SINK_NAME, contentId -> contentId);
FluxRegistry.bindSink(AssessmentConstants.ANSWERS_UPDATED_SINK_NAME,
AssessmentConstants.COMPLETION_CHARTS_UPDATE_SINK_NAME, contentId -> contentId);
+
+ FluxRegistry.initFluxMap(AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_FLUX_NAME,
+ AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_SINK_NAME, null, (Long toolContentId) -> {
+ try {
+ // without separate session the flux fetches cached data
+ HibernateSessionManager.openSession();
+
+ ObjectNode timeLimitSettingsJson = getTimeLimitSettingsJson(toolContentId);
+ return timeLimitSettingsJson.toString();
+ } finally {
+ HibernateSessionManager.closeSession();
+ }
+ }, FluxMap.STANDARD_THROTTLE, FluxMap.STANDARD_TIMEOUT);
}
// *******************************************************************************
@@ -352,8 +354,13 @@
if (learnersStarted == 1 && assessment.getRelativeTimeLimit() == 0 && assessment.getAbsoluteTimeLimit() > 0
&& assessment.getAbsoluteTimeLimitFinish() == null) {
assessment.setAbsoluteTimeLimitFinish(LocalDateTime.now().plusMinutes(assessment.getAbsoluteTimeLimit()));
+ assessment.setAbsoluteTimeLimit(0);
assessmentDao.saveObject(assessment);
+
+ FluxRegistry.emit(CommonConstants.ACTIVITY_TIME_LIMIT_CHANGED_SINK_NAME, Set.of(toolContentId));
+ FluxRegistry.emit(AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_SINK_NAME, toolContentId);
}
+
AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), Long.valueOf(userId));
if (lastResult == null) {
return null;
@@ -907,6 +914,11 @@
return FluxRegistry.get(AssessmentConstants.COMPLETION_CHARTS_UPDATE_FLUX_NAME, toolContentId);
}
+ @Override
+ public Flux getTimeLimitPanelUpdateFlux(long toolContentId) {
+ return FluxRegistry.get(AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_FLUX_NAME, toolContentId);
+ }
+
/**
* @return grade that user scored by answering that question
*/
@@ -4269,6 +4281,15 @@
}
+ private ObjectNode getTimeLimitSettingsJson(long toolContentId) {
+ ObjectNode timeLimitSettings = JsonNodeFactory.instance.objectNode();
+ Assessment assessment = getAssessmentByContentId(toolContentId);
+ timeLimitSettings.put("relativeTimeLimit", assessment.getRelativeTimeLimit());
+ timeLimitSettings.put("absoluteTimeLimit", assessment.getAbsoluteTimeLimit());
+ timeLimitSettings.put("absoluteTimeLimitFinish", assessment.getAbsoluteTimeLimitFinishSeconds());
+ return timeLimitSettings;
+ }
+
private Map getAnsweredQuestionsByUsersJson(long toolContentId) {
Map> answeredQuestions = assessmentResultDao.getAnsweredQuestionsByUsersForCompletionChart(
toolContentId);
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java
===================================================================
diff -u -rf8f156c0f021d60857760ea60579a41e1380288c -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision f8f156c0f021d60857760ea60579a41e1380288c)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -262,6 +262,8 @@
Flux getCompletionChartsDataFlux(long toolContentId);
+ Flux getTimeLimitPanelUpdateFlux(long toolContentId);
+
void loadupLastAttempt(Long assessmentUid, Long userId, List> pagedQuestionDtos);
/**
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -90,7 +90,6 @@
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.util.HtmlUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -252,11 +251,17 @@
@RequestMapping(path = "/getCompletionChartsData", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
- public Flux getCompletionChartsData(@RequestParam long toolContentId)
- throws JsonProcessingException, IOException {
+ public Flux getCompletionChartsData(@RequestParam long toolContentId) {
return service.getCompletionChartsDataFlux(toolContentId);
}
+ @RequestMapping(path = "/getTimeLimitPanelUpdateFlux", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ @ResponseBody
+ public Flux getTimeLimitPanelUpdateFlux(@RequestParam long toolContentId, HttpServletResponse response) {
+ response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);
+ return service.getTimeLimitPanelUpdateFlux(toolContentId);
+ }
+
@RequestMapping("/userMasterDetail")
public String userMasterDetail(HttpServletRequest request, HttpServletResponse response) {
Long userId = WebUtil.readLongParam(request, AttributeNames.PARAM_USER_ID);
@@ -912,26 +917,33 @@
@RequestMapping(path = "/updateTimeLimit", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public void updateTimeLimit(@RequestParam(name = AssessmentConstants.PARAM_TOOL_CONTENT_ID) long toolContentId,
- @RequestParam int relativeTimeLimit, @RequestParam(required = false) Long absoluteTimeLimit) {
+ @RequestParam int relativeTimeLimit, @RequestParam int absoluteTimeLimit,
+ @RequestParam(required = false) Long absoluteTimeLimitFinish, @RequestParam(required = false) Long callId) {
if (relativeTimeLimit < 0) {
throw new InvalidParameterException(
"Relative time limit must not be negative and it is " + relativeTimeLimit);
}
- if (absoluteTimeLimit != null && relativeTimeLimit != 0) {
+ if (absoluteTimeLimit < 0) {
throw new InvalidParameterException(
+ "Absolute time limit must not be negative and it is " + relativeTimeLimit);
+ }
+ if (absoluteTimeLimitFinish != null && relativeTimeLimit != 0) {
+ throw new InvalidParameterException(
"Relative time limit must not be provided when absolute time limit is set");
}
Assessment assessment = service.getAssessmentByContentId(toolContentId);
assessment.setRelativeTimeLimit(relativeTimeLimit);
+ assessment.setAbsoluteTimeLimit(absoluteTimeLimit);
// set time limit as seconds from start of epoch, using current server time zone
- assessment.setAbsoluteTimeLimitFinish(absoluteTimeLimit == null
+ assessment.setAbsoluteTimeLimitFinish(absoluteTimeLimitFinish == null
? null
- : LocalDateTime.ofEpochSecond(absoluteTimeLimit, 0, OffsetDateTime.now().getOffset()));
+ : LocalDateTime.ofEpochSecond(absoluteTimeLimitFinish, 0, OffsetDateTime.now().getOffset()));
service.saveOrUpdateAssessment(assessment);
// update monitoring UI where time limits are reflected on dashboard
FluxRegistry.emit(CommonConstants.ACTIVITY_TIME_LIMIT_CHANGED_SINK_NAME, Set.of(toolContentId));
+ FluxRegistry.emit(AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_SINK_NAME, toolContentId);
}
@RequestMapping(path = "/getPossibleIndividualTimeLimits", method = RequestMethod.GET)
@@ -1063,6 +1075,9 @@
}
}
service.saveOrUpdateAssessment(assessment);
+
+ FluxRegistry.emit(AssessmentConstants.TIME_LIMIT_PANEL_UPDATE_SINK_NAME, toolContentId);
+
}
@RequestMapping(path = "/displayChangeLeaderForGroupDialogFromActivity")
Index: lams_tool_assessment/web/pages/monitoring/summary.jsp
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -8,8 +8,9 @@
monitoring/timeLimit.jsp
-
+
+
Index: lams_tool_assessment/web/pages/tblmonitoring/assessmentStudentChoices.jsp
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/web/pages/tblmonitoring/assessmentStudentChoices.jsp (.../assessmentStudentChoices.jsp) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/web/pages/tblmonitoring/assessmentStudentChoices.jsp (.../assessmentStudentChoices.jsp) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -4,8 +4,9 @@
monitoring/timeLimit5.jsp
-
+
+
Index: lams_tool_assessment/web/pages/tblmonitoring/iraAssessmentStudentChoices.jsp
===================================================================
diff -u -r2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588 -r0083f3733489a25a89db5cfa6810303c015acd8f
--- lams_tool_assessment/web/pages/tblmonitoring/iraAssessmentStudentChoices.jsp (.../iraAssessmentStudentChoices.jsp) (revision 2bc8f0c2f65f02cb65aa7e90d0bbb612494a4588)
+++ lams_tool_assessment/web/pages/tblmonitoring/iraAssessmentStudentChoices.jsp (.../iraAssessmentStudentChoices.jsp) (revision 0083f3733489a25a89db5cfa6810303c015acd8f)
@@ -4,8 +4,9 @@
monitoring/timeLimit5.jsp
-
+
+
@@ -45,6 +46,19 @@
pageInitialised = false;
$(document).ready(function(){
+ openEventSource(' monitoring/getTimeLimitPanelUpdateFlux.do?toolContentId=${toolContentID}', function(event) {
+ if (!event.data) {
+ return;
+ }
+
+ // destroy existing absolute time limit counter before refresh
+ $('.absolute-time-limit-counter').countdown('destroy');
+ let data = JSON.parse(event.data);
+ $('#time-limit-panel-placeholder').load(' monitoring/timeLimit5.jsp?toolContentId=${toolContentID}&absoluteTimeLimitFinish=' + data.absoluteTimeLimitFinish
+ + '&relativeTimeLimit=' + data.relativeTimeLimit + '&absoluteTimeLimit=' + data.absoluteTimeLimit
+ + '&isTbl=true&controllerContext=tool/laasse10/monitoring');
+ });
+
openEventSource(' monitoring/getCompletionChartsData.do?toolContentId=${toolContentID}', function(event) {
if (!event.data) {
return;
@@ -64,10 +78,7 @@
openQuestionModal.one('hidden.bs.modal', function() {
$('#student-choices-table').load(' tblmonitoring/iraAssessmentStudentChoicesTable.do?toolContentID=${toolContentID}');
});
-
});
-
- $('#time-limit-panel-placeholder').load('${timeLimitPanelUrl}');
});
function exportExcel(){