Index: lams_tool_assessment/web/pages/authoring/authoring.jsp =================================================================== diff -u -r864f2b803a021db179bce114a069ca7aadc54ce2 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_assessment/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 864f2b803a021db179bce114a069ca7aadc54ce2) +++ lams_tool_assessment/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -37,7 +37,7 @@ } var timeLimit = $('#relativeTimeLimit').val(); - if (!timeLimit) { + if (!timeLimit || timeLimit < 0) { $('#relativeTimeLimit').val(0); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dbupdates/patch20210301.sql =================================================================== diff -u --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dbupdates/patch20210301.sql (revision 0) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dbupdates/patch20210301.sql (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -0,0 +1,19 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +-- Put all sql statements below here + +--LDEV-5185 Add advanced time limits to Scratchie + +ALTER TABLE tl_lascrt11_scratchie CHANGE COLUMN time_limit relative_time_limit SMALLINT UNSIGNED NOT NULL DEFAULT 0; + +ALTER TABLE tl_lascrt11_scratchie ADD COLUMN absolute_time_limit DATETIME AFTER relative_time_limit; + +ALTER TABLE tl_lascrt11_session ADD COLUMN time_limit_adjustment SMALLINT NOT NULL DEFAULT 0 AFTER time_limit_launched_date; + +-- Put all sql statements above here + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/Scratchie.java =================================================================== diff -u -rff2a65f961b0f2da0af4e9ed9a90abb284f165d8 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/Scratchie.java (.../Scratchie.java) (revision ff2a65f961b0f2da0af4e9ed9a90abb284f165d8) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/Scratchie.java (.../Scratchie.java) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.scratchie.model; +import java.time.LocalDateTime; import java.util.Date; import java.util.Iterator; import java.util.Set; @@ -100,9 +101,12 @@ @Column(name = "shuffle_items") private boolean shuffleItems; - @Column(name = "time_limit") - private int timeLimit; + @Column(name = "relative_time_limit") + private int relativeTimeLimit; + @Column(name = "absolute_time_limit") + private LocalDateTime absoluteTimeLimit; + @Column(name = "double_click") private boolean revealOnDoubleClick; @@ -368,18 +372,26 @@ /** * @return Returns the time limitation, that students have to complete an attempt. */ - public int getTimeLimit() { - return timeLimit; + public int getRelativeTimeLimit() { + return relativeTimeLimit; } /** * @param timeLimit * the time limitation, that students have to complete an attempt. */ - public void setTimeLimit(int timeLimit) { - this.timeLimit = timeLimit; + public void setRelativeTimeLimit(int timeLimit) { + this.relativeTimeLimit = timeLimit; } + public LocalDateTime getAbsoluteTimeLimit() { + return absoluteTimeLimit; + } + + public void setAbsoluteTimeLimit(LocalDateTime absoluteTimeLimit) { + this.absoluteTimeLimit = absoluteTimeLimit; + } + public boolean isRevealOnDoubleClick() { return revealOnDoubleClick; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java =================================================================== diff -u -r122ff0d8419be3fac72ddb842cbbce1cea01e542 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java (.../ScratchieSession.java) (revision 122ff0d8419be3fac72ddb842cbbce1cea01e542) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java (.../ScratchieSession.java) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -24,10 +24,7 @@ package org.lamsfoundation.lams.tool.scratchie.model; import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -36,7 +33,6 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; import javax.persistence.Table; import org.lamsfoundation.lams.tool.scratchie.ScratchieConstants; @@ -75,6 +71,9 @@ @Column(name = "time_limit_launched_date") private Date timeLimitLaunchedDate; + @Column(name = "time_limit_adjustment") + private int timeLimitAdjustment; + // finish or not @Column private int status; @@ -117,6 +116,14 @@ this.timeLimitLaunchedDate = timeLimitLaunchedDate; } + public int getTimeLimitAdjustment() { + return timeLimitAdjustment; + } + + public void setTimeLimitAdjustment(int relativeTimeLimitAdjustment) { + this.timeLimitAdjustment = relativeTimeLimitAdjustment; + } + public Date getSessionStartDate() { return sessionStartDate; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r705c0f72b765849974bfa0d9f8b04797619e8da7 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 705c0f72b765849974bfa0d9f8b04797619e8da7) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -2817,7 +2817,7 @@ scratchie.setInstructions(JsonUtil.optString(toolContentJSON, RestTags.INSTRUCTIONS)); scratchie.setBurningQuestionsEnabled(JsonUtil.optBoolean(toolContentJSON, "burningQuestionsEnabled", true)); - scratchie.setTimeLimit(JsonUtil.optInt(toolContentJSON, "timeLimit", 0)); + scratchie.setRelativeTimeLimit(JsonUtil.optInt(toolContentJSON, "timeLimit", 0)); scratchie.setExtraPoint(JsonUtil.optBoolean(toolContentJSON, "extraPoint", false)); scratchie.setReflectOnActivity( JsonUtil.optBoolean(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java =================================================================== diff -u -r705c0f72b765849974bfa0d9f8b04797619e8da7 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision 705c0f72b765849974bfa0d9f8b04797619e8da7) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -251,7 +251,7 @@ } // check time limits - if (scratchie.getTimeLimit() != 0 && !mode.isTeacher()) { + if (scratchie.getRelativeTimeLimit() != 0 && !mode.isTeacher()) { // show waitForLeaderLaunchTimeLimit page if the leader hasn't started activity if (!isUserLeader && toolSession.getTimeLimitLaunchedDate() == null) { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r705c0f72b765849974bfa0d9f8b04797619e8da7 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 705c0f72b765849974bfa0d9f8b04797619e8da7) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -107,10 +107,12 @@ TimeCache existingTimeSettings = new TimeCache(); existingTimeSettings.absoluteTimeLimit = null; - existingTimeSettings.relativeTimeLimit = scratchie.getTimeLimit() * 60; + existingTimeSettings.relativeTimeLimit = scratchie.getRelativeTimeLimit() * 60; existingTimeSettings.timeLimitAdjustment = new HashMap<>(); Map sessionLaunchDates = new HashMap<>(); + Map sessionTimeLimitAdjustments = new HashMap<>(); + for (Integer userId : userIds) { ScratchieUser user = scratchieService.getUserByUserIDAndContentID(userId.longValue(), toolContentId); if (user == null) { @@ -119,20 +121,27 @@ ScratchieSession session = user.getSession(); LocalDateTime sessionLaunchDate = null; + Integer timeLimitAdjustment = null; if (sessionLaunchDates.containsKey(session.getUid())) { sessionLaunchDate = sessionLaunchDates.get(session.getUid()); + timeLimitAdjustment = sessionTimeLimitAdjustments.get(session.getUid()); } else { Date launchDate = session.getTimeLimitLaunchedDate(); if (launchDate != null) { sessionLaunchDate = launchDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - } + timeLimitAdjustment = session.getTimeLimitAdjustment(); - sessionLaunchDates.put(session.getUid(), sessionLaunchDate); + sessionLaunchDates.put(session.getUid(), sessionLaunchDate); + sessionTimeLimitAdjustments.put(session.getUid(), timeLimitAdjustment); + } } if (sessionLaunchDate != null) { existingTimeSettings.timeLimitLaunchedDate.put(userId, sessionLaunchDate); + if (timeLimitAdjustment != null) { + existingTimeSettings.timeLimitAdjustment.put(userId, timeLimitAdjustment); + } } } Index: lams_tool_scratchie/web/pages/authoring/advance.jsp =================================================================== diff -u -rd1086e12b3afabb5388fdad8075e6d28d21170b5 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/web/pages/authoring/advance.jsp (.../advance.jsp) (revision d1086e12b3afabb5388fdad8075e6d28d21170b5) +++ lams_tool_scratchie/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -102,16 +102,14 @@ - -
- - - -
+
+ + +
Index: lams_tool_scratchie/web/pages/authoring/authoring.jsp =================================================================== diff -u -r8e9679511a3c197f72a83b6d6e746b7ec6f8f3f5 -r0bf300963373e88adfe45bd5484f6683516ef966 --- lams_tool_scratchie/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 8e9679511a3c197f72a83b6d6e746b7ec6f8f3f5) +++ lams_tool_scratchie/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 0bf300963373e88adfe45bd5484f6683516ef966) @@ -70,11 +70,21 @@ // avoid name clash between bootstrap and jQuery UI $.fn.bootstrapTooltip = $.fn.tooltip.noConflict(); + + function validateForm(){ + var timeLimit = $('#relativeTimeLimit').val(); + if (!timeLimit || timeLimit < 1) { + $('#relativeTimeLimit').val(0); + } + + return true; + } - +