Index: lams_admin/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_admin/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_admin/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_central/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_central/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_central/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_gradebook/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_gradebook/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_gradebook/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_learning/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_learning/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_learning/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_monitoring/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_monitoring/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_monitoring/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_tool_assessment/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_assessment/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_tool_assessment/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_tool_chat/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_chat/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_tool_chat/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_tool_daco/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_daco/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_tool_daco/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_tool_doku/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rdbb83a20e36def6c8cb9763e542714cef162e0a2 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision dbb83a20e36def6c8cb9763e542714cef162e0a2) +++ lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -73,7 +73,12 @@ label.cant.display.faulty.pad = This session has had problems with initialization. You can fix this by pressing the Recreate pad button. label.pad.started.fixing = Please wait. Pad is getting recreated now. label.pad.fixed = Pad has been successfully created. Please refresh the page to see its content. -label.time.limit = Time limit (minutes) +label.authoring.advance.time.limit = Time limit duration (minutes) +label.authoring.advance.time.limit.none = none +label.authoring.advance.time.limit.relative = relative to from student start +label.authoring.advance.time.limit.relative.tooltip = Set the duration in minutes that the learners will have to complete the assessment. The duration will apply from the moment each learner begins the assessment. For example, if set to 5 minutes, all learners will have 5 minutes from the moment each of them start the assessment. +label.authoring.advance.time.limit.absolute = for all learners +label.authoring.advance.time.limit.absolute.tooltip = Set the number of minutes to finish the assessment for all learners. The duration will apply from the moment the first learner starts the assessment. label.plus.one.minute = +1 minute label.start.activity = Start activity label.started.activity = Activity has been started @@ -126,7 +131,6 @@ label.authoring.basic.instructions.tooltip = If you want the students to have a template document to guide them on their collaborative response, add your template here. label.authoring.basic.description.tooltip = Description or case to be presented to students. label.attendance = Attendance -label.time.limit.tooltip = Number of minutes that each student will get from the moment they enter this activity. Leave it at 0 for no time restrictions. label.monitoring.learner.marks.name = Name label.monitoring.learner.marks.copy.1 = Give all label.monitoring.learner.marks.copy.2 = marks Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java =================================================================== diff -u -rdbb83a20e36def6c8cb9763e542714cef162e0a2 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java (.../Dokumaran.java) (revision dbb83a20e36def6c8cb9763e542714cef162e0a2) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java (.../Dokumaran.java) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -80,8 +80,11 @@ private int relativeTimeLimit; @Column(name = "absolute_time_limit") - private LocalDateTime absoluteTimeLimit; + private int absoluteTimeLimit; + @Column(name = "absolute_time_limit_finish") + private LocalDateTime absoluteTimeLimitFinish; + @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "tl_ladoku11_time_limit", joinColumns = @JoinColumn(name = "dokumaran_uid")) @MapKeyColumn(name = "user_id") @@ -174,7 +177,7 @@ Dokumaran.log.error("When clone " + Dokumaran.class + " failed"); } - dokumaran.setAbsoluteTimeLimit(null); + dokumaran.setAbsoluteTimeLimitFinish(null); dokumaran.setTimeLimitAdjustments(new HashMap<>(this.getTimeLimitAdjustments())); dokumaran.setGalleryWalkStarted(false); dokumaran.setGalleryWalkFinished(false); @@ -377,18 +380,28 @@ this.relativeTimeLimit = timeLimit; } - public LocalDateTime getAbsoluteTimeLimit() { + public int getAbsoluteTimeLimit() { return absoluteTimeLimit; } - public void setAbsoluteTimeLimit(LocalDateTime absoluteTimeLimit) { + public void setAbsoluteTimeLimit(int absoluteTimeLimit) { this.absoluteTimeLimit = absoluteTimeLimit; } - public Long getAbsoluteTimeLimitSeconds() { - return absoluteTimeLimit == null ? null : absoluteTimeLimit.atZone(ZoneId.systemDefault()).toEpochSecond(); + public LocalDateTime getAbsoluteTimeLimitFinish() { + return absoluteTimeLimitFinish; } + public void setAbsoluteTimeLimitFinish(LocalDateTime absoluteTimeLimitFinish) { + this.absoluteTimeLimitFinish = absoluteTimeLimitFinish; + } + + public Long getAbsoluteTimeLimitFinishSeconds() { + return absoluteTimeLimitFinish == null + ? null + : absoluteTimeLimitFinish.atZone(ZoneId.systemDefault()).toEpochSecond(); + } + public Map getTimeLimitAdjustments() { return timeLimitAdjustments; } Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== diff -u -rdbb83a20e36def6c8cb9763e542714cef162e0a2 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision dbb83a20e36def6c8cb9763e542714cef162e0a2) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -33,6 +33,8 @@ import org.lamsfoundation.lams.etherpad.EtherpadException; import org.lamsfoundation.lams.etherpad.service.IEtherpadService; import org.lamsfoundation.lams.etherpad.util.EtherpadUtil; +import org.lamsfoundation.lams.flux.FluxMap; +import org.lamsfoundation.lams.flux.FluxRegistry; import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -67,8 +69,10 @@ 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.CommonConstants; import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.hibernate.HibernateSessionManager; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -115,6 +119,22 @@ private DokumaranOutputFactory dokumaranOutputFactory; + public DokumaranService() { + + FluxRegistry.initFluxMap(DokumaranConstants.TIME_LIMIT_PANEL_UPDATE_FLUX_NAME, + DokumaranConstants.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); + } + // ******************************************************************************* // Service method // ******************************************************************************* @@ -308,22 +328,42 @@ @Override public LocalDateTime launchTimeLimit(long toolContentId, int userId) { + int learnersStarted = 0; + Dokumaran dokumaran = null; + for (DokumaranSession dokumaranSession : dokumaranSessionDao.getByContentId(toolContentId)) { + if (dokumaran == null) { + dokumaran = dokumaranSession.getDokumaran(); + } + learnersStarted += dokumaranUserDao.getBySessionID(dokumaranSession.getSessionId()).size(); + if (learnersStarted > 1) { + break; + } + } + if (learnersStarted == 1 && dokumaran.getRelativeTimeLimit() == 0 && dokumaran.getAbsoluteTimeLimit() > 0 + && dokumaran.getAbsoluteTimeLimitFinish() == null) { + dokumaran.setAbsoluteTimeLimitFinish(LocalDateTime.now().plusMinutes(dokumaran.getAbsoluteTimeLimit())); + dokumaran.setAbsoluteTimeLimit(0); + dokumaranDao.saveObject(dokumaran); + + FluxRegistry.emit(CommonConstants.ACTIVITY_TIME_LIMIT_CHANGED_SINK_NAME, Set.of(toolContentId)); + FluxRegistry.emit(DokumaranConstants.TIME_LIMIT_PANEL_UPDATE_SINK_NAME, toolContentId); + } + DokumaranUser user = getLearnerByIDAndContent(Long.valueOf(userId), toolContentId); if (user != null) { DokumaranSession session = user.getSession(); - Dokumaran dokumaran = session.getDokumaran(); - if (user.getTimeLimitLaunchedDate() == null) { - LocalDateTime launchedDate = LocalDateTime.now(); + LocalDateTime launchedDate = user.getTimeLimitLaunchedDate(); + if (launchedDate == null) { + launchedDate = LocalDateTime.now(); user.setTimeLimitLaunchedDate(launchedDate); dokumaranUserDao.saveObject(user); - - // if the user is not a leader, store his launch date, but return null so the leader's launch date is in use - if (!dokumaran.isUseSelectLeaderToolOuput() || (session.getGroupLeader() != null - && session.getGroupLeader().getUserId().equals(Long.valueOf(userId)))) { - return launchedDate; - } } + // if the user is not a leader, store his launch date, but return null so the leader's launch date is in use + if (!dokumaran.isUseSelectLeaderToolOuput() || (session.getGroupLeader() != null && session.getGroupLeader() + .getUserId().equals(Long.valueOf(userId)))) { + return launchedDate; + } } return null; } @@ -1121,6 +1161,16 @@ etherpadService.createCookie(etherpadSessionIds, response); } + + private ObjectNode getTimeLimitSettingsJson(long toolContentId) { + ObjectNode timeLimitSettings = JsonNodeFactory.instance.objectNode(); + Dokumaran dokumaran = getDokumaranByContentId(toolContentId); + timeLimitSettings.put("relativeTimeLimit", dokumaran.getRelativeTimeLimit()); + timeLimitSettings.put("absoluteTimeLimit", dokumaran.getAbsoluteTimeLimit()); + timeLimitSettings.put("absoluteTimeLimitFinish", dokumaran.getAbsoluteTimeLimitFinishSeconds()); + return timeLimitSettings; + } + @Override public String leaveToolSession(Long toolSessionId, Long learnerId) throws DataMissingException, ToolException { if (toolSessionId == null) { Index: lams_tool_doku/web/WEB-INF/tags/Rating.tag =================================================================== diff -u -r5f8dff0cc7d791c9cb34c850aaf235ca604055d7 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_doku/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 5f8dff0cc7d791c9cb34c850aaf235ca604055d7) +++ lams_tool_doku/web/WEB-INF/tags/Rating.tag (.../Rating.tag) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -196,15 +196,19 @@ -
-
-
-
+
+
Index: lams_tool_doku/web/pages/authoring/advance.jsp =================================================================== diff -u -rdbb83a20e36def6c8cb9763e542714cef162e0a2 -r66aaa15469871d9f71cafcfc4222ffa90f2d9bb2 --- lams_tool_doku/web/pages/authoring/advance.jsp (.../advance.jsp) (revision dbb83a20e36def6c8cb9763e542714cef162e0a2) +++ lams_tool_doku/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 66aaa15469871d9f71cafcfc4222ffa90f2d9bb2) @@ -1,22 +1,47 @@ -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ include file="/common/taglibs.jsp"%> - @@ -28,11 +53,11 @@
- +
@@ -43,68 +68,98 @@ - -
+ +
-
- - -
-
- +
- +
- +
+ + +
+
+ +
+ +
+ +   + +
+ +
+ +   + +
+
+
+

- +
- +
@@ -138,31 +193,31 @@
- +
- +
- + - - + + + + + + <%@ include file="websocket.jsp"%> + + - function finishSession(){ - document.location.href =''; - } + - function continueReflect(){ - document.location.href=''; - } - - - - - <%@ include file="websocket.jsp"%> - - - - - - - -

- - -

-

-
- - -

- - + + +

+ + +

+

+
+ + +

+
+ + + + + + + + - - + + - - - - - - - - - - -
- -

- - -