diff --git a/bower.json b/bower.json index ca65994..91a6799 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "adapt-contrib-assessment", "version": "4.1.0", - "framework": ">=5", + "framework": ">=5.4", "homepage": "https://github.com/adaptlearning/adapt-contrib-assessment", "issues": "https://github.com/adaptlearning/adapt_framework/issues/new", "extension" : "assessment", diff --git a/js/adapt-assessmentArticleModel.js b/js/adapt-assessmentArticleModel.js index 4c65ee3..8beddb6 100644 --- a/js/adapt-assessmentArticleModel.js +++ b/js/adapt-assessmentArticleModel.js @@ -222,6 +222,7 @@ define([ for (var j = 0, count = children.length; j < count; j++) { var blockModel = children[j]; var blockAssessmentConfig = blockModel.get('_assessment'); + if (!blockAssessmentConfig) continue; bankId = blockAssessmentConfig._quizBankID; this._questionBanks[bankId].addBlock(blockModel); } @@ -656,47 +657,44 @@ define([ getSaveState: function() { var state = this.getState(); - var indexByIdQuestions = []; + let blocks; var cfg = this.getConfig(); var banksActive = cfg._banks && cfg._banks._isEnabled && cfg._banks._split.length > 1; var randomisationActive = cfg._randomisation && cfg._randomisation._isEnabled; if (!banksActive && !randomisationActive) { - // include presentation component IDs in save state so that blocks without questions aren't removed - this.findDescendantModels('components').forEach(function(component) { - var componentModel = { - _id: component.get('_id'), - _isCorrect: component.get('_isCorrect') === undefined ? null : component.get('_isCorrect') - }; - - indexByIdQuestions.push(componentModel); - - }); - - indexByIdQuestions = _.indexBy(indexByIdQuestions, '_id'); + // include presentation blocks in save state so that blocks without questions aren't removed + blocks = this.findDescendantModels('block'); } else { - indexByIdQuestions = _.indexBy(state.questions, '_id'); - } - - for (var id in indexByIdQuestions) { - if (indexByIdQuestions.hasOwnProperty(id)) { - indexByIdQuestions[id] = indexByIdQuestions[id]._isCorrect; - } + blocks = state.questions.map(question => Adapt.findById(question._id).getParent()); } + blocks = blocks.filter(block => { + const trackingId = block.get('_trackingId'); + return Number.isInteger(trackingId) && trackingId >= 0; + }); + const blockTrackingIds = blocks.map(block => block.get('_trackingId')); + const blockCompletion = blocks.map(block => { + let questions = block.findDescendantModels('question'); + return questions.map(question => question.get('_isCorrect') || false); + }); + const blockData = [blockTrackingIds, blockCompletion]; - var saveState = [ + const saveState = [ state.isComplete ? 1:0, state.attemptsSpent, - state.maxScore, + state.maxScore || 0, state.score, state.attemptInProgress ? 1:0, - indexByIdQuestions ]; - return saveState; + const dataPackage = [saveState, blockData] + + return dataPackage; }, - setRestoreState: function(restoreState) { + setRestoreState: function(dataPackage) { + const restoreState = dataPackage[0]; + const blockData = dataPackage[1]; var id; var isComplete = restoreState[0] == 1 ? true : false; var attempts = this.get('_attempts'); @@ -706,18 +704,11 @@ define([ var attemptInProgress = restoreState[4] == 1 ? true : false; var scoreAsPercent; - var indexByIdQuestions = restoreState[5]; + let blocks = blockData[0].map(trackingId => Adapt.data.findWhere({ _trackingId: trackingId })); - var blockIds = {}; - for (id in indexByIdQuestions) { - if (indexByIdQuestions.hasOwnProperty(id)) { - var blockId = Adapt.findById(id).get('_parentId'); - blockIds[blockId] = Adapt.findById(blockId); - } + if (blocks.length) { + this.getChildren().models = blocks; } - var restoredChildrenModels = _.values(blockIds); - - if (indexByIdQuestions) this.getChildren().models = restoredChildrenModels; this.set({ _isAssessmentComplete: isComplete, @@ -741,15 +732,15 @@ define([ }); var questions = []; - for (id in indexByIdQuestions) { - if (indexByIdQuestions.hasOwnProperty(id) && Adapt.findById(id).get('_isQuestionType')) { + blocks.forEach((block, blockIndex) => { + const blockQuestions = block.findDescendantModels('question'); + blockQuestions.forEach((question, questionIndex) => { questions.push({ - _id: id, - _isCorrect: indexByIdQuestions[id] + _id: question.get('_id'), + _isCorrect: blockData[1][blockIndex][questionIndex] }); - } - } - + }); + }); this.set('_questions', questions); if (isComplete) this._checkIsPass(); diff --git a/js/assessment.js b/js/assessment.js index 4d2ddb7..d119e7d 100644 --- a/js/assessment.js +++ b/js/assessment.js @@ -51,12 +51,12 @@ define([ _restoreModelState: function(assessmentModel) { if (!this._saveStateModel) { - this._saveStateModel = Adapt.offlineStorage.get('assessment'); + this._saveStateModel = Adapt.offlineStorage.get('a'); } if (this._saveStateModel) { var state = assessmentModel.getState(); if (this._saveStateModel[state.id]) { - assessmentModel.setRestoreState(this._saveStateModel[state.id]); + assessmentModel.setRestoreState(Adapt.offlineStorage.deserialize(this._saveStateModel[state.id])); } } @@ -139,7 +139,7 @@ define([ this._restoredCount = 0; }, - + _checkAssessmentsComplete: function() { var allAssessmentsComplete = true; @@ -323,10 +323,10 @@ define([ this._saveStateModel = {}; for (var i = 0, assessmentModel; assessmentModel = this._assessments[i++];) { var state = assessmentModel.getState(); - this._saveStateModel[state.id] = assessmentModel.getSaveState(); + this._saveStateModel[state.id] = Adapt.offlineStorage.serialize(assessmentModel.getSaveState()) } - Adapt.offlineStorage.set('assessment', this._saveStateModel); + Adapt.offlineStorage.set('a', this._saveStateModel); }, getConfig: function () {