Skip to content

Commit 140f811

Browse files
Interactives: checkLocalStorage respects termStartDate from eBookConfig
1 parent bede5cc commit 140f811

11 files changed

Lines changed: 65 additions & 15 deletions

File tree

bases/rsptx/interactives/runestone/clickableArea/js/clickable.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,17 +152,21 @@ export default class ClickableArea extends RunestoneBase {
152152
var ex = localStorage.getItem(this.localStorageKey());
153153
if (ex !== null) {
154154
this.hasStoredAnswers = true;
155+
let error = false;
155156
try {
156157
storageObj = JSON.parse(ex);
157-
this.clickedIndexArray = storageObj.answer.split(";");
158158
} catch (err) {
159159
// error while parsing; likely due to bad value stored in storage
160-
console.log(err.message);
160+
console.log(`Error parsing stored ClickableArea data for ${this.divid}: ${err.message}`);
161+
error = true;
162+
}
163+
if (error || storageObj.timestamp < eBookConfig.termStartDate) {
161164
localStorage.removeItem(this.localStorageKey());
162165
this.hasStoredAnswers = false;
163166
this.restoreAnswers({});
164167
return;
165168
}
169+
this.clickedIndexArray = storageObj.answer.split(";");
166170
if (this.useRunestoneServices) {
167171
// log answer to server
168172
this.givenIndexArray = [];

bases/rsptx/interactives/runestone/dragndrop/js/dragndrop.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,19 +700,24 @@ export default class DragNDrop extends RunestoneBase {
700700
var ex = localStorage.getItem(this.localStorageKey());
701701
if (ex !== null) {
702702
this.hasStoredDropzones = true;
703+
let error = false;
703704
try {
704705
storedObj = JSON.parse(ex);
705706
this.minheight = storedObj.min_height;
706707
this.dragwidth = storedObj.drag_width;
707708
this.dropwidth = storedObj.drop_width;
708709
} catch (err) {
709710
// error while parsing; likely due to bad value stored in storage
710-
console.log(err.message);
711+
console.log(`Error parsing stored DragNDrop data for ${this.divid}: ${err}`);
712+
error = true;
713+
}
714+
if (error || storedObj.timestamp < eBookConfig.termStartDate) {
711715
localStorage.removeItem(this.localStorageKey());
712716
this.hasStoredDropzones = false;
713717
this.finishSettingUp();
714718
return;
715719
}
720+
localStorage.removeItem(this.localStorageKey());
716721
this.answerState = storedObj.answer;
717722
if (this.useRunestoneServices) {
718723
// store answer in database

bases/rsptx/interactives/runestone/fitb/js/fitb.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,15 @@ export default class FITB extends RunestoneBase {
442442
if (len > 0) {
443443
var ex = localStorage.getItem(this.localStorageKey());
444444
if (ex !== null) {
445+
let error = false;
445446
try {
446447
storedData = JSON.parse(ex);
447448
} catch (err) {
448449
// error while parsing; likely due to bad value stored in storage
449-
console.assert(false, err.message);
450+
console.log(`Error parsing stored FITB data for ${this.divid}: ${err.message}`);
451+
error = true;
452+
}
453+
if (error || storedData.timestamp < eBookConfig.termStartDate) {
450454
localStorage.removeItem(this.localStorageKey());
451455
return;
452456
}

bases/rsptx/interactives/runestone/hparsons/js/hparsons.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,11 @@ export default class HParsons extends RunestoneBase {
278278
return;
279279
}
280280
let localData = this.localData();
281+
// Guard against no timestamp as it was only added 3/24/2026
282+
if (localData.timestamp && localData.timestamp < eBookConfig.termStartDate) {
283+
localStorage.removeItem(this.storageId);
284+
return;
285+
}
281286
if (localData.answerIndices && this.hparsonsInput.restoreAnswerByIndices) {
282287
this.hparsonsInput.restoreAnswerByIndices(localData.answerIndices.map(Number));
283288
} else if (localData.answer) {
@@ -299,7 +304,6 @@ export default class HParsons extends RunestoneBase {
299304
setLocalStorage(data) {
300305
let currentState = {};
301306
if (data == undefined) {
302-
303307
if (this.isBlockGrading) {
304308
const answerIndices = this.hparsonsInput.getBlockIndices();
305309
currentState = { answerIndices: answerIndices };
@@ -308,7 +312,7 @@ export default class HParsons extends RunestoneBase {
308312
const userAnswer = this.hparsonsInput.getParsonsTextArray();
309313
currentState = { answer: userAnswer };
310314
}
311-
315+
currentState.timestamp = new Date();
312316
} else {
313317
currentState = data;
314318
}

bases/rsptx/interactives/runestone/lp/js/lp.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,15 @@ class LP extends RunestoneBase {
253253
var key = this.localStorageKey();
254254
var ex = localStorage.getItem(key);
255255
if (ex !== null) {
256+
let error = false;
256257
try {
257258
storedData = JSON.parse(ex);
258259
} catch (err) {
259260
// error while parsing; likely due to bad value stored in storage
260-
console.log(err.message);
261+
console.log(`Error parsing stored LP data for ${this.divid}: ${err.message}`);
262+
error = true;
263+
}
264+
if (error || storedData.timestamp < eBookConfig.termStartDate) {
261265
localStorage.removeItem(key);
262266
return;
263267
}

bases/rsptx/interactives/runestone/matching/js/matching.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ export class MatchingProblem extends RunestoneBase {
170170
const data = localStorage.getItem(this.divid);
171171
if (data) {
172172
const parsedData = JSON.parse(data);
173+
if (parsedData.timestamp && parsedData.timestamp < eBookConfig.termStartDate) {
174+
localStorage.removeItem(this.divid);
175+
return;
176+
}
173177
this.connections = parsedData.connections.map(conn => ({
174178
fromBox: this.allBoxes.find(box => box.dataset.id === conn.from),
175179
toBox: this.allBoxes.find(box => box.dataset.id === conn.to)
@@ -184,6 +188,7 @@ export class MatchingProblem extends RunestoneBase {
184188
}
185189
}
186190
setLocalStorage() {
191+
const timeStamp = new Date();
187192
const data = {
188193
connections: this.connections.map(conn => ({
189194
from: conn.fromBox.dataset.id,
@@ -192,7 +197,8 @@ export class MatchingProblem extends RunestoneBase {
192197
score: this.scorePercent,
193198
correctCount: this.correctCount,
194199
incorrectCount: this.incorrectCount,
195-
missingCount: this.missingCount
200+
missingCount: this.missingCount,
201+
timestamp: timeStamp
196202
};
197203
localStorage.setItem(this.divid, JSON.stringify(data));
198204
}

bases/rsptx/interactives/runestone/mchoice/js/mchoice.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,13 +346,17 @@ export default class MultipleChoice extends RunestoneBase {
346346
var len = localStorage.length;
347347
if (len > 0) {
348348
var ex = localStorage.getItem(this.localStorageKey());
349+
let error = false;
349350
if (ex !== null) {
350351
try {
351352
storedData = JSON.parse(ex);
352353
answers = storedData.answer.split(",");
353354
} catch (err) {
354355
// error while parsing; likely due to bad value stored in storage
355-
console.log(err.message);
356+
console.log(`Error parsing stored mchoice data for ${this.divid}: ${err.message}`);
357+
error = true;
358+
}
359+
if (error || storedData.timestamp < eBookConfig.termStartDate) {
356360
localStorage.removeItem(this.localStorageKey());
357361
return;
358362
}

bases/rsptx/interactives/runestone/parsons/js/parsons.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,12 @@ export default class Parsons extends RunestoneBase {
998998
if (this.graderactive) {
999999
return;
10001000
}
1001-
this.loadData(this.localData());
1001+
const localData = this.localData();
1002+
if (localData.timestamp && localData.timestamp < eBookConfig.termStartDate) {
1003+
localStorage.removeItem(this.storageId);
1004+
localData= {};
1005+
}
1006+
this.loadData(localData);
10021007
}
10031008
// RunestoneBase: Set the state of the problem in local storage
10041009
setLocalStorage(data) {

bases/rsptx/interactives/runestone/shortanswer/js/shortanswer.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,16 @@ export default class ShortAnswer extends RunestoneBase {
252252
if (len > 0) {
253253
var ex = localStorage.getItem(this.localStorageKey());
254254
if (ex !== null) {
255+
let error = false;
255256
try {
256257
var storedData = JSON.parse(ex);
257258
answer = storedData.answer;
258259
} catch (err) {
259260
// error while parsing; likely due to bad value stored in storage
260-
console.log(err.message);
261+
console.log(`Error parsing stored shortanswer data for ${this.divid}: ${err.message}`);
262+
error = true;
263+
}
264+
if (error || storedData.timestamp < eBookConfig.termStartDate) {
261265
localStorage.removeItem(this.localStorageKey());
262266
return;
263267
}

bases/rsptx/interactives/runestone/timed/js/timed.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,13 +1193,19 @@ export default class Timed extends RunestoneBase {
11931193
this.taken = 1;
11941194
var tmpArr;
11951195
if (data === "") {
1196+
let error = false;
1197+
let storageObj;
11961198
try {
1197-
tmpArr = JSON.parse(
1199+
storageObj = JSON.parse(
11981200
localStorage.getItem(this.localStorageKey())
1199-
).answer;
1201+
);
1202+
tmpArr = storageObj.answer;
12001203
} catch (err) {
12011204
// error while parsing; likely due to bad value stored in storage
1202-
console.log(err.message);
1205+
console.log(`Error parsing stored Timed data for ${this.divid}: ${err.message}`);
1206+
error = true;
1207+
}
1208+
if (error || storageObj.timestamp < eBookConfig.termStartDate) {
12031209
localStorage.removeItem(this.localStorageKey());
12041210
this.taken = 0;
12051211
return;

0 commit comments

Comments
 (0)